linux/drivers/net/ethernet/mscc/ocelot.c
<<
>>
Prefs
   1// SPDX-License-Identifier: (GPL-2.0 OR MIT)
   2/*
   3 * Microsemi Ocelot Switch driver
   4 *
   5 * Copyright (c) 2017 Microsemi Corporation
   6 */
   7#include <linux/dsa/ocelot.h>
   8#include <linux/if_bridge.h>
   9#include <linux/ptp_classify.h>
  10#include <soc/mscc/ocelot_vcap.h>
  11#include "ocelot.h"
  12#include "ocelot_vcap.h"
  13
  14#define TABLE_UPDATE_SLEEP_US 10
  15#define TABLE_UPDATE_TIMEOUT_US 100000
  16#define OCELOT_RSV_VLAN_RANGE_START 4000
  17
  18struct ocelot_mact_entry {
  19        u8 mac[ETH_ALEN];
  20        u16 vid;
  21        enum macaccess_entry_type type;
  22};
  23
  24/* Caller must hold &ocelot->mact_lock */
  25static inline u32 ocelot_mact_read_macaccess(struct ocelot *ocelot)
  26{
  27        return ocelot_read(ocelot, ANA_TABLES_MACACCESS);
  28}
  29
  30/* Caller must hold &ocelot->mact_lock */
  31static inline int ocelot_mact_wait_for_completion(struct ocelot *ocelot)
  32{
  33        u32 val;
  34
  35        return readx_poll_timeout(ocelot_mact_read_macaccess,
  36                ocelot, val,
  37                (val & ANA_TABLES_MACACCESS_MAC_TABLE_CMD_M) ==
  38                MACACCESS_CMD_IDLE,
  39                TABLE_UPDATE_SLEEP_US, TABLE_UPDATE_TIMEOUT_US);
  40}
  41
  42/* Caller must hold &ocelot->mact_lock */
  43static void ocelot_mact_select(struct ocelot *ocelot,
  44                               const unsigned char mac[ETH_ALEN],
  45                               unsigned int vid)
  46{
  47        u32 macl = 0, mach = 0;
  48
  49        /* Set the MAC address to handle and the vlan associated in a format
  50         * understood by the hardware.
  51         */
  52        mach |= vid    << 16;
  53        mach |= mac[0] << 8;
  54        mach |= mac[1] << 0;
  55        macl |= mac[2] << 24;
  56        macl |= mac[3] << 16;
  57        macl |= mac[4] << 8;
  58        macl |= mac[5] << 0;
  59
  60        ocelot_write(ocelot, macl, ANA_TABLES_MACLDATA);
  61        ocelot_write(ocelot, mach, ANA_TABLES_MACHDATA);
  62
  63}
  64
  65static int __ocelot_mact_learn(struct ocelot *ocelot, int port,
  66                               const unsigned char mac[ETH_ALEN],
  67                               unsigned int vid, enum macaccess_entry_type type)
  68{
  69        u32 cmd = ANA_TABLES_MACACCESS_VALID |
  70                ANA_TABLES_MACACCESS_DEST_IDX(port) |
  71                ANA_TABLES_MACACCESS_ENTRYTYPE(type) |
  72                ANA_TABLES_MACACCESS_MAC_TABLE_CMD(MACACCESS_CMD_LEARN);
  73        unsigned int mc_ports;
  74        int err;
  75
  76        /* Set MAC_CPU_COPY if the CPU port is used by a multicast entry */
  77        if (type == ENTRYTYPE_MACv4)
  78                mc_ports = (mac[1] << 8) | mac[2];
  79        else if (type == ENTRYTYPE_MACv6)
  80                mc_ports = (mac[0] << 8) | mac[1];
  81        else
  82                mc_ports = 0;
  83
  84        if (mc_ports & BIT(ocelot->num_phys_ports))
  85                cmd |= ANA_TABLES_MACACCESS_MAC_CPU_COPY;
  86
  87        ocelot_mact_select(ocelot, mac, vid);
  88
  89        /* Issue a write command */
  90        ocelot_write(ocelot, cmd, ANA_TABLES_MACACCESS);
  91
  92        err = ocelot_mact_wait_for_completion(ocelot);
  93
  94        return err;
  95}
  96
  97int ocelot_mact_learn(struct ocelot *ocelot, int port,
  98                      const unsigned char mac[ETH_ALEN],
  99                      unsigned int vid, enum macaccess_entry_type type)
 100{
 101        int ret;
 102
 103        mutex_lock(&ocelot->mact_lock);
 104        ret = __ocelot_mact_learn(ocelot, port, mac, vid, type);
 105        mutex_unlock(&ocelot->mact_lock);
 106
 107        return ret;
 108}
 109EXPORT_SYMBOL(ocelot_mact_learn);
 110
 111int ocelot_mact_forget(struct ocelot *ocelot,
 112                       const unsigned char mac[ETH_ALEN], unsigned int vid)
 113{
 114        int err;
 115
 116        mutex_lock(&ocelot->mact_lock);
 117
 118        ocelot_mact_select(ocelot, mac, vid);
 119
 120        /* Issue a forget command */
 121        ocelot_write(ocelot,
 122                     ANA_TABLES_MACACCESS_MAC_TABLE_CMD(MACACCESS_CMD_FORGET),
 123                     ANA_TABLES_MACACCESS);
 124
 125        err = ocelot_mact_wait_for_completion(ocelot);
 126
 127        mutex_unlock(&ocelot->mact_lock);
 128
 129        return err;
 130}
 131EXPORT_SYMBOL(ocelot_mact_forget);
 132
 133int ocelot_mact_lookup(struct ocelot *ocelot, int *dst_idx,
 134                       const unsigned char mac[ETH_ALEN],
 135                       unsigned int vid, enum macaccess_entry_type *type)
 136{
 137        int val;
 138
 139        mutex_lock(&ocelot->mact_lock);
 140
 141        ocelot_mact_select(ocelot, mac, vid);
 142
 143        /* Issue a read command with MACACCESS_VALID=1. */
 144        ocelot_write(ocelot, ANA_TABLES_MACACCESS_VALID |
 145                     ANA_TABLES_MACACCESS_MAC_TABLE_CMD(MACACCESS_CMD_READ),
 146                     ANA_TABLES_MACACCESS);
 147
 148        if (ocelot_mact_wait_for_completion(ocelot)) {
 149                mutex_unlock(&ocelot->mact_lock);
 150                return -ETIMEDOUT;
 151        }
 152
 153        /* Read back the entry flags */
 154        val = ocelot_read(ocelot, ANA_TABLES_MACACCESS);
 155
 156        mutex_unlock(&ocelot->mact_lock);
 157
 158        if (!(val & ANA_TABLES_MACACCESS_VALID))
 159                return -ENOENT;
 160
 161        *dst_idx = ANA_TABLES_MACACCESS_DEST_IDX_X(val);
 162        *type = ANA_TABLES_MACACCESS_ENTRYTYPE_X(val);
 163
 164        return 0;
 165}
 166EXPORT_SYMBOL(ocelot_mact_lookup);
 167
 168int ocelot_mact_learn_streamdata(struct ocelot *ocelot, int dst_idx,
 169                                 const unsigned char mac[ETH_ALEN],
 170                                 unsigned int vid,
 171                                 enum macaccess_entry_type type,
 172                                 int sfid, int ssid)
 173{
 174        int ret;
 175
 176        mutex_lock(&ocelot->mact_lock);
 177
 178        ocelot_write(ocelot,
 179                     (sfid < 0 ? 0 : ANA_TABLES_STREAMDATA_SFID_VALID) |
 180                     ANA_TABLES_STREAMDATA_SFID(sfid) |
 181                     (ssid < 0 ? 0 : ANA_TABLES_STREAMDATA_SSID_VALID) |
 182                     ANA_TABLES_STREAMDATA_SSID(ssid),
 183                     ANA_TABLES_STREAMDATA);
 184
 185        ret = __ocelot_mact_learn(ocelot, dst_idx, mac, vid, type);
 186
 187        mutex_unlock(&ocelot->mact_lock);
 188
 189        return ret;
 190}
 191EXPORT_SYMBOL(ocelot_mact_learn_streamdata);
 192
 193static void ocelot_mact_init(struct ocelot *ocelot)
 194{
 195        /* Configure the learning mode entries attributes:
 196         * - Do not copy the frame to the CPU extraction queues.
 197         * - Use the vlan and mac_cpoy for dmac lookup.
 198         */
 199        ocelot_rmw(ocelot, 0,
 200                   ANA_AGENCTRL_LEARN_CPU_COPY | ANA_AGENCTRL_IGNORE_DMAC_FLAGS
 201                   | ANA_AGENCTRL_LEARN_FWD_KILL
 202                   | ANA_AGENCTRL_LEARN_IGNORE_VLAN,
 203                   ANA_AGENCTRL);
 204
 205        /* Clear the MAC table. We are not concurrent with anyone, so
 206         * holding &ocelot->mact_lock is pointless.
 207         */
 208        ocelot_write(ocelot, MACACCESS_CMD_INIT, ANA_TABLES_MACACCESS);
 209}
 210
 211static void ocelot_vcap_enable(struct ocelot *ocelot, int port)
 212{
 213        ocelot_write_gix(ocelot, ANA_PORT_VCAP_S2_CFG_S2_ENA |
 214                         ANA_PORT_VCAP_S2_CFG_S2_IP6_CFG(0xa),
 215                         ANA_PORT_VCAP_S2_CFG, port);
 216
 217        ocelot_write_gix(ocelot, ANA_PORT_VCAP_CFG_S1_ENA,
 218                         ANA_PORT_VCAP_CFG, port);
 219
 220        ocelot_rmw_gix(ocelot, REW_PORT_CFG_ES0_EN,
 221                       REW_PORT_CFG_ES0_EN,
 222                       REW_PORT_CFG, port);
 223}
 224
 225static int ocelot_single_vlan_aware_bridge(struct ocelot *ocelot,
 226                                           struct netlink_ext_ack *extack)
 227{
 228        struct net_device *bridge = NULL;
 229        int port;
 230
 231        for (port = 0; port < ocelot->num_phys_ports; port++) {
 232                struct ocelot_port *ocelot_port = ocelot->ports[port];
 233
 234                if (!ocelot_port || !ocelot_port->bridge ||
 235                    !br_vlan_enabled(ocelot_port->bridge))
 236                        continue;
 237
 238                if (!bridge) {
 239                        bridge = ocelot_port->bridge;
 240                        continue;
 241                }
 242
 243                if (bridge == ocelot_port->bridge)
 244                        continue;
 245
 246                NL_SET_ERR_MSG_MOD(extack,
 247                                   "Only one VLAN-aware bridge is supported");
 248                return -EBUSY;
 249        }
 250
 251        return 0;
 252}
 253
 254static inline u32 ocelot_vlant_read_vlanaccess(struct ocelot *ocelot)
 255{
 256        return ocelot_read(ocelot, ANA_TABLES_VLANACCESS);
 257}
 258
 259static inline int ocelot_vlant_wait_for_completion(struct ocelot *ocelot)
 260{
 261        u32 val;
 262
 263        return readx_poll_timeout(ocelot_vlant_read_vlanaccess,
 264                ocelot,
 265                val,
 266                (val & ANA_TABLES_VLANACCESS_VLAN_TBL_CMD_M) ==
 267                ANA_TABLES_VLANACCESS_CMD_IDLE,
 268                TABLE_UPDATE_SLEEP_US, TABLE_UPDATE_TIMEOUT_US);
 269}
 270
 271static int ocelot_vlant_set_mask(struct ocelot *ocelot, u16 vid, u32 mask)
 272{
 273        /* Select the VID to configure */
 274        ocelot_write(ocelot, ANA_TABLES_VLANTIDX_V_INDEX(vid),
 275                     ANA_TABLES_VLANTIDX);
 276        /* Set the vlan port members mask and issue a write command */
 277        ocelot_write(ocelot, ANA_TABLES_VLANACCESS_VLAN_PORT_MASK(mask) |
 278                             ANA_TABLES_VLANACCESS_CMD_WRITE,
 279                     ANA_TABLES_VLANACCESS);
 280
 281        return ocelot_vlant_wait_for_completion(ocelot);
 282}
 283
 284static int ocelot_port_num_untagged_vlans(struct ocelot *ocelot, int port)
 285{
 286        struct ocelot_bridge_vlan *vlan;
 287        int num_untagged = 0;
 288
 289        list_for_each_entry(vlan, &ocelot->vlans, list) {
 290                if (!(vlan->portmask & BIT(port)))
 291                        continue;
 292
 293                if (vlan->untagged & BIT(port))
 294                        num_untagged++;
 295        }
 296
 297        return num_untagged;
 298}
 299
 300static int ocelot_port_num_tagged_vlans(struct ocelot *ocelot, int port)
 301{
 302        struct ocelot_bridge_vlan *vlan;
 303        int num_tagged = 0;
 304
 305        list_for_each_entry(vlan, &ocelot->vlans, list) {
 306                if (!(vlan->portmask & BIT(port)))
 307                        continue;
 308
 309                if (!(vlan->untagged & BIT(port)))
 310                        num_tagged++;
 311        }
 312
 313        return num_tagged;
 314}
 315
 316/* We use native VLAN when we have to mix egress-tagged VLANs with exactly
 317 * _one_ egress-untagged VLAN (_the_ native VLAN)
 318 */
 319static bool ocelot_port_uses_native_vlan(struct ocelot *ocelot, int port)
 320{
 321        return ocelot_port_num_tagged_vlans(ocelot, port) &&
 322               ocelot_port_num_untagged_vlans(ocelot, port) == 1;
 323}
 324
 325static struct ocelot_bridge_vlan *
 326ocelot_port_find_native_vlan(struct ocelot *ocelot, int port)
 327{
 328        struct ocelot_bridge_vlan *vlan;
 329
 330        list_for_each_entry(vlan, &ocelot->vlans, list)
 331                if (vlan->portmask & BIT(port) && vlan->untagged & BIT(port))
 332                        return vlan;
 333
 334        return NULL;
 335}
 336
 337/* Keep in sync REW_TAG_CFG_TAG_CFG and, if applicable,
 338 * REW_PORT_VLAN_CFG_PORT_VID, with the bridge VLAN table and VLAN awareness
 339 * state of the port.
 340 */
 341static void ocelot_port_manage_port_tag(struct ocelot *ocelot, int port)
 342{
 343        struct ocelot_port *ocelot_port = ocelot->ports[port];
 344        enum ocelot_port_tag_config tag_cfg;
 345        bool uses_native_vlan = false;
 346
 347        if (ocelot_port->vlan_aware) {
 348                uses_native_vlan = ocelot_port_uses_native_vlan(ocelot, port);
 349
 350                if (uses_native_vlan)
 351                        tag_cfg = OCELOT_PORT_TAG_NATIVE;
 352                else if (ocelot_port_num_untagged_vlans(ocelot, port))
 353                        tag_cfg = OCELOT_PORT_TAG_DISABLED;
 354                else
 355                        tag_cfg = OCELOT_PORT_TAG_TRUNK;
 356        } else {
 357                tag_cfg = OCELOT_PORT_TAG_DISABLED;
 358        }
 359
 360        ocelot_rmw_gix(ocelot, REW_TAG_CFG_TAG_CFG(tag_cfg),
 361                       REW_TAG_CFG_TAG_CFG_M,
 362                       REW_TAG_CFG, port);
 363
 364        if (uses_native_vlan) {
 365                struct ocelot_bridge_vlan *native_vlan;
 366
 367                /* Not having a native VLAN is impossible, because
 368                 * ocelot_port_num_untagged_vlans has returned 1.
 369                 * So there is no use in checking for NULL here.
 370                 */
 371                native_vlan = ocelot_port_find_native_vlan(ocelot, port);
 372
 373                ocelot_rmw_gix(ocelot,
 374                               REW_PORT_VLAN_CFG_PORT_VID(native_vlan->vid),
 375                               REW_PORT_VLAN_CFG_PORT_VID_M,
 376                               REW_PORT_VLAN_CFG, port);
 377        }
 378}
 379
 380int ocelot_bridge_num_find(struct ocelot *ocelot,
 381                           const struct net_device *bridge)
 382{
 383        int port;
 384
 385        for (port = 0; port < ocelot->num_phys_ports; port++) {
 386                struct ocelot_port *ocelot_port = ocelot->ports[port];
 387
 388                if (ocelot_port && ocelot_port->bridge == bridge)
 389                        return ocelot_port->bridge_num;
 390        }
 391
 392        return -1;
 393}
 394EXPORT_SYMBOL_GPL(ocelot_bridge_num_find);
 395
 396static u16 ocelot_vlan_unaware_pvid(struct ocelot *ocelot,
 397                                    const struct net_device *bridge)
 398{
 399        int bridge_num;
 400
 401        /* Standalone ports use VID 0 */
 402        if (!bridge)
 403                return 0;
 404
 405        bridge_num = ocelot_bridge_num_find(ocelot, bridge);
 406        if (WARN_ON(bridge_num < 0))
 407                return 0;
 408
 409        /* VLAN-unaware bridges use a reserved VID going from 4095 downwards */
 410        return VLAN_N_VID - bridge_num - 1;
 411}
 412
 413/* Default vlan to clasify for untagged frames (may be zero) */
 414static void ocelot_port_set_pvid(struct ocelot *ocelot, int port,
 415                                 const struct ocelot_bridge_vlan *pvid_vlan)
 416{
 417        struct ocelot_port *ocelot_port = ocelot->ports[port];
 418        u16 pvid = ocelot_vlan_unaware_pvid(ocelot, ocelot_port->bridge);
 419        u32 val = 0;
 420
 421        ocelot_port->pvid_vlan = pvid_vlan;
 422
 423        if (ocelot_port->vlan_aware && pvid_vlan)
 424                pvid = pvid_vlan->vid;
 425
 426        ocelot_rmw_gix(ocelot,
 427                       ANA_PORT_VLAN_CFG_VLAN_VID(pvid),
 428                       ANA_PORT_VLAN_CFG_VLAN_VID_M,
 429                       ANA_PORT_VLAN_CFG, port);
 430
 431        /* If there's no pvid, we should drop not only untagged traffic (which
 432         * happens automatically), but also 802.1p traffic which gets
 433         * classified to VLAN 0, but that is always in our RX filter, so it
 434         * would get accepted were it not for this setting.
 435         */
 436        if (!pvid_vlan && ocelot_port->vlan_aware)
 437                val = ANA_PORT_DROP_CFG_DROP_PRIO_S_TAGGED_ENA |
 438                      ANA_PORT_DROP_CFG_DROP_PRIO_C_TAGGED_ENA;
 439
 440        ocelot_rmw_gix(ocelot, val,
 441                       ANA_PORT_DROP_CFG_DROP_PRIO_S_TAGGED_ENA |
 442                       ANA_PORT_DROP_CFG_DROP_PRIO_C_TAGGED_ENA,
 443                       ANA_PORT_DROP_CFG, port);
 444}
 445
 446static struct ocelot_bridge_vlan *ocelot_bridge_vlan_find(struct ocelot *ocelot,
 447                                                          u16 vid)
 448{
 449        struct ocelot_bridge_vlan *vlan;
 450
 451        list_for_each_entry(vlan, &ocelot->vlans, list)
 452                if (vlan->vid == vid)
 453                        return vlan;
 454
 455        return NULL;
 456}
 457
 458static int ocelot_vlan_member_add(struct ocelot *ocelot, int port, u16 vid,
 459                                  bool untagged)
 460{
 461        struct ocelot_bridge_vlan *vlan = ocelot_bridge_vlan_find(ocelot, vid);
 462        unsigned long portmask;
 463        int err;
 464
 465        if (vlan) {
 466                portmask = vlan->portmask | BIT(port);
 467
 468                err = ocelot_vlant_set_mask(ocelot, vid, portmask);
 469                if (err)
 470                        return err;
 471
 472                vlan->portmask = portmask;
 473                /* Bridge VLANs can be overwritten with a different
 474                 * egress-tagging setting, so make sure to override an untagged
 475                 * with a tagged VID if that's going on.
 476                 */
 477                if (untagged)
 478                        vlan->untagged |= BIT(port);
 479                else
 480                        vlan->untagged &= ~BIT(port);
 481
 482                return 0;
 483        }
 484
 485        vlan = kzalloc(sizeof(*vlan), GFP_KERNEL);
 486        if (!vlan)
 487                return -ENOMEM;
 488
 489        portmask = BIT(port);
 490
 491        err = ocelot_vlant_set_mask(ocelot, vid, portmask);
 492        if (err) {
 493                kfree(vlan);
 494                return err;
 495        }
 496
 497        vlan->vid = vid;
 498        vlan->portmask = portmask;
 499        if (untagged)
 500                vlan->untagged = BIT(port);
 501        INIT_LIST_HEAD(&vlan->list);
 502        list_add_tail(&vlan->list, &ocelot->vlans);
 503
 504        return 0;
 505}
 506
 507static int ocelot_vlan_member_del(struct ocelot *ocelot, int port, u16 vid)
 508{
 509        struct ocelot_bridge_vlan *vlan = ocelot_bridge_vlan_find(ocelot, vid);
 510        unsigned long portmask;
 511        int err;
 512
 513        if (!vlan)
 514                return 0;
 515
 516        portmask = vlan->portmask & ~BIT(port);
 517
 518        err = ocelot_vlant_set_mask(ocelot, vid, portmask);
 519        if (err)
 520                return err;
 521
 522        vlan->portmask = portmask;
 523        if (vlan->portmask)
 524                return 0;
 525
 526        list_del(&vlan->list);
 527        kfree(vlan);
 528
 529        return 0;
 530}
 531
 532static int ocelot_add_vlan_unaware_pvid(struct ocelot *ocelot, int port,
 533                                        const struct net_device *bridge)
 534{
 535        u16 vid = ocelot_vlan_unaware_pvid(ocelot, bridge);
 536
 537        return ocelot_vlan_member_add(ocelot, port, vid, true);
 538}
 539
 540static int ocelot_del_vlan_unaware_pvid(struct ocelot *ocelot, int port,
 541                                        const struct net_device *bridge)
 542{
 543        u16 vid = ocelot_vlan_unaware_pvid(ocelot, bridge);
 544
 545        return ocelot_vlan_member_del(ocelot, port, vid);
 546}
 547
 548int ocelot_port_vlan_filtering(struct ocelot *ocelot, int port,
 549                               bool vlan_aware, struct netlink_ext_ack *extack)
 550{
 551        struct ocelot_vcap_block *block = &ocelot->block[VCAP_IS1];
 552        struct ocelot_port *ocelot_port = ocelot->ports[port];
 553        struct ocelot_vcap_filter *filter;
 554        int err = 0;
 555        u32 val;
 556
 557        list_for_each_entry(filter, &block->rules, list) {
 558                if (filter->ingress_port_mask & BIT(port) &&
 559                    filter->action.vid_replace_ena) {
 560                        NL_SET_ERR_MSG_MOD(extack,
 561                                           "Cannot change VLAN state with vlan modify rules active");
 562                        return -EBUSY;
 563                }
 564        }
 565
 566        err = ocelot_single_vlan_aware_bridge(ocelot, extack);
 567        if (err)
 568                return err;
 569
 570        if (vlan_aware)
 571                err = ocelot_del_vlan_unaware_pvid(ocelot, port,
 572                                                   ocelot_port->bridge);
 573        else if (ocelot_port->bridge)
 574                err = ocelot_add_vlan_unaware_pvid(ocelot, port,
 575                                                   ocelot_port->bridge);
 576        if (err)
 577                return err;
 578
 579        ocelot_port->vlan_aware = vlan_aware;
 580
 581        if (vlan_aware)
 582                val = ANA_PORT_VLAN_CFG_VLAN_AWARE_ENA |
 583                      ANA_PORT_VLAN_CFG_VLAN_POP_CNT(1);
 584        else
 585                val = 0;
 586        ocelot_rmw_gix(ocelot, val,
 587                       ANA_PORT_VLAN_CFG_VLAN_AWARE_ENA |
 588                       ANA_PORT_VLAN_CFG_VLAN_POP_CNT_M,
 589                       ANA_PORT_VLAN_CFG, port);
 590
 591        ocelot_port_set_pvid(ocelot, port, ocelot_port->pvid_vlan);
 592        ocelot_port_manage_port_tag(ocelot, port);
 593
 594        return 0;
 595}
 596EXPORT_SYMBOL(ocelot_port_vlan_filtering);
 597
 598int ocelot_vlan_prepare(struct ocelot *ocelot, int port, u16 vid, bool pvid,
 599                        bool untagged, struct netlink_ext_ack *extack)
 600{
 601        if (untagged) {
 602                /* We are adding an egress-tagged VLAN */
 603                if (ocelot_port_uses_native_vlan(ocelot, port)) {
 604                        NL_SET_ERR_MSG_MOD(extack,
 605                                           "Port with egress-tagged VLANs cannot have more than one egress-untagged (native) VLAN");
 606                        return -EBUSY;
 607                }
 608        } else {
 609                /* We are adding an egress-tagged VLAN */
 610                if (ocelot_port_num_untagged_vlans(ocelot, port) > 1) {
 611                        NL_SET_ERR_MSG_MOD(extack,
 612                                           "Port with more than one egress-untagged VLAN cannot have egress-tagged VLANs");
 613                        return -EBUSY;
 614                }
 615        }
 616
 617        if (vid > OCELOT_RSV_VLAN_RANGE_START) {
 618                NL_SET_ERR_MSG_MOD(extack,
 619                                   "VLAN range 4000-4095 reserved for VLAN-unaware bridging");
 620                return -EBUSY;
 621        }
 622
 623        return 0;
 624}
 625EXPORT_SYMBOL(ocelot_vlan_prepare);
 626
 627int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid,
 628                    bool untagged)
 629{
 630        int err;
 631
 632        /* Ignore VID 0 added to our RX filter by the 8021q module, since
 633         * that collides with OCELOT_STANDALONE_PVID and changes it from
 634         * egress-untagged to egress-tagged.
 635         */
 636        if (!vid)
 637                return 0;
 638
 639        err = ocelot_vlan_member_add(ocelot, port, vid, untagged);
 640        if (err)
 641                return err;
 642
 643        /* Default ingress vlan classification */
 644        if (pvid)
 645                ocelot_port_set_pvid(ocelot, port,
 646                                     ocelot_bridge_vlan_find(ocelot, vid));
 647
 648        /* Untagged egress vlan clasification */
 649        ocelot_port_manage_port_tag(ocelot, port);
 650
 651        return 0;
 652}
 653EXPORT_SYMBOL(ocelot_vlan_add);
 654
 655int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid)
 656{
 657        struct ocelot_port *ocelot_port = ocelot->ports[port];
 658        bool del_pvid = false;
 659        int err;
 660
 661        if (!vid)
 662                return 0;
 663
 664        if (ocelot_port->pvid_vlan && ocelot_port->pvid_vlan->vid == vid)
 665                del_pvid = true;
 666
 667        err = ocelot_vlan_member_del(ocelot, port, vid);
 668        if (err)
 669                return err;
 670
 671        /* Ingress */
 672        if (del_pvid)
 673                ocelot_port_set_pvid(ocelot, port, NULL);
 674
 675        /* Egress */
 676        ocelot_port_manage_port_tag(ocelot, port);
 677
 678        return 0;
 679}
 680EXPORT_SYMBOL(ocelot_vlan_del);
 681
 682static void ocelot_vlan_init(struct ocelot *ocelot)
 683{
 684        unsigned long all_ports = GENMASK(ocelot->num_phys_ports - 1, 0);
 685        u16 port, vid;
 686
 687        /* Clear VLAN table, by default all ports are members of all VLANs */
 688        ocelot_write(ocelot, ANA_TABLES_VLANACCESS_CMD_INIT,
 689                     ANA_TABLES_VLANACCESS);
 690        ocelot_vlant_wait_for_completion(ocelot);
 691
 692        /* Configure the port VLAN memberships */
 693        for (vid = 1; vid < VLAN_N_VID; vid++)
 694                ocelot_vlant_set_mask(ocelot, vid, 0);
 695
 696        /* We need VID 0 to get traffic on standalone ports.
 697         * It is added automatically if the 8021q module is loaded, but we
 698         * can't rely on that since it might not be.
 699         */
 700        ocelot_vlant_set_mask(ocelot, OCELOT_STANDALONE_PVID, all_ports);
 701
 702        /* Set vlan ingress filter mask to all ports but the CPU port by
 703         * default.
 704         */
 705        ocelot_write(ocelot, all_ports, ANA_VLANMASK);
 706
 707        for (port = 0; port < ocelot->num_phys_ports; port++) {
 708                ocelot_write_gix(ocelot, 0, REW_PORT_VLAN_CFG, port);
 709                ocelot_write_gix(ocelot, 0, REW_TAG_CFG, port);
 710        }
 711}
 712
 713static u32 ocelot_read_eq_avail(struct ocelot *ocelot, int port)
 714{
 715        return ocelot_read_rix(ocelot, QSYS_SW_STATUS, port);
 716}
 717
 718static int ocelot_port_flush(struct ocelot *ocelot, int port)
 719{
 720        unsigned int pause_ena;
 721        int err, val;
 722
 723        /* Disable dequeuing from the egress queues */
 724        ocelot_rmw_rix(ocelot, QSYS_PORT_MODE_DEQUEUE_DIS,
 725                       QSYS_PORT_MODE_DEQUEUE_DIS,
 726                       QSYS_PORT_MODE, port);
 727
 728        /* Disable flow control */
 729        ocelot_fields_read(ocelot, port, SYS_PAUSE_CFG_PAUSE_ENA, &pause_ena);
 730        ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_ENA, 0);
 731
 732        /* Disable priority flow control */
 733        ocelot_fields_write(ocelot, port,
 734                            QSYS_SWITCH_PORT_MODE_TX_PFC_ENA, 0);
 735
 736        /* Wait at least the time it takes to receive a frame of maximum length
 737         * at the port.
 738         * Worst-case delays for 10 kilobyte jumbo frames are:
 739         * 8 ms on a 10M port
 740         * 800 μs on a 100M port
 741         * 80 μs on a 1G port
 742         * 32 μs on a 2.5G port
 743         */
 744        usleep_range(8000, 10000);
 745
 746        /* Disable half duplex backpressure. */
 747        ocelot_rmw_rix(ocelot, 0, SYS_FRONT_PORT_MODE_HDX_MODE,
 748                       SYS_FRONT_PORT_MODE, port);
 749
 750        /* Flush the queues associated with the port. */
 751        ocelot_rmw_gix(ocelot, REW_PORT_CFG_FLUSH_ENA, REW_PORT_CFG_FLUSH_ENA,
 752                       REW_PORT_CFG, port);
 753
 754        /* Enable dequeuing from the egress queues. */
 755        ocelot_rmw_rix(ocelot, 0, QSYS_PORT_MODE_DEQUEUE_DIS, QSYS_PORT_MODE,
 756                       port);
 757
 758        /* Wait until flushing is complete. */
 759        err = read_poll_timeout(ocelot_read_eq_avail, val, !val,
 760                                100, 2000000, false, ocelot, port);
 761
 762        /* Clear flushing again. */
 763        ocelot_rmw_gix(ocelot, 0, REW_PORT_CFG_FLUSH_ENA, REW_PORT_CFG, port);
 764
 765        /* Re-enable flow control */
 766        ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_ENA, pause_ena);
 767
 768        return err;
 769}
 770
 771void ocelot_phylink_mac_link_down(struct ocelot *ocelot, int port,
 772                                  unsigned int link_an_mode,
 773                                  phy_interface_t interface,
 774                                  unsigned long quirks)
 775{
 776        struct ocelot_port *ocelot_port = ocelot->ports[port];
 777        int err;
 778
 779        ocelot_port->speed = SPEED_UNKNOWN;
 780
 781        ocelot_port_rmwl(ocelot_port, 0, DEV_MAC_ENA_CFG_RX_ENA,
 782                         DEV_MAC_ENA_CFG);
 783
 784        if (ocelot->ops->cut_through_fwd) {
 785                mutex_lock(&ocelot->fwd_domain_lock);
 786                ocelot->ops->cut_through_fwd(ocelot);
 787                mutex_unlock(&ocelot->fwd_domain_lock);
 788        }
 789
 790        ocelot_fields_write(ocelot, port, QSYS_SWITCH_PORT_MODE_PORT_ENA, 0);
 791
 792        err = ocelot_port_flush(ocelot, port);
 793        if (err)
 794                dev_err(ocelot->dev, "failed to flush port %d: %d\n",
 795                        port, err);
 796
 797        /* Put the port in reset. */
 798        if (interface != PHY_INTERFACE_MODE_QSGMII ||
 799            !(quirks & OCELOT_QUIRK_QSGMII_PORTS_MUST_BE_UP))
 800                ocelot_port_rmwl(ocelot_port,
 801                                 DEV_CLOCK_CFG_MAC_TX_RST |
 802                                 DEV_CLOCK_CFG_MAC_RX_RST,
 803                                 DEV_CLOCK_CFG_MAC_TX_RST |
 804                                 DEV_CLOCK_CFG_MAC_RX_RST,
 805                                 DEV_CLOCK_CFG);
 806}
 807EXPORT_SYMBOL_GPL(ocelot_phylink_mac_link_down);
 808
 809void ocelot_phylink_mac_link_up(struct ocelot *ocelot, int port,
 810                                struct phy_device *phydev,
 811                                unsigned int link_an_mode,
 812                                phy_interface_t interface,
 813                                int speed, int duplex,
 814                                bool tx_pause, bool rx_pause,
 815                                unsigned long quirks)
 816{
 817        struct ocelot_port *ocelot_port = ocelot->ports[port];
 818        int mac_speed, mode = 0;
 819        u32 mac_fc_cfg;
 820
 821        ocelot_port->speed = speed;
 822
 823        /* The MAC might be integrated in systems where the MAC speed is fixed
 824         * and it's the PCS who is performing the rate adaptation, so we have
 825         * to write "1000Mbps" into the LINK_SPEED field of DEV_CLOCK_CFG
 826         * (which is also its default value).
 827         */
 828        if ((quirks & OCELOT_QUIRK_PCS_PERFORMS_RATE_ADAPTATION) ||
 829            speed == SPEED_1000) {
 830                mac_speed = OCELOT_SPEED_1000;
 831                mode = DEV_MAC_MODE_CFG_GIGA_MODE_ENA;
 832        } else if (speed == SPEED_2500) {
 833                mac_speed = OCELOT_SPEED_2500;
 834                mode = DEV_MAC_MODE_CFG_GIGA_MODE_ENA;
 835        } else if (speed == SPEED_100) {
 836                mac_speed = OCELOT_SPEED_100;
 837        } else {
 838                mac_speed = OCELOT_SPEED_10;
 839        }
 840
 841        if (duplex == DUPLEX_FULL)
 842                mode |= DEV_MAC_MODE_CFG_FDX_ENA;
 843
 844        ocelot_port_writel(ocelot_port, mode, DEV_MAC_MODE_CFG);
 845
 846        /* Take port out of reset by clearing the MAC_TX_RST, MAC_RX_RST and
 847         * PORT_RST bits in DEV_CLOCK_CFG.
 848         */
 849        ocelot_port_writel(ocelot_port, DEV_CLOCK_CFG_LINK_SPEED(mac_speed),
 850                           DEV_CLOCK_CFG);
 851
 852        switch (speed) {
 853        case SPEED_10:
 854                mac_fc_cfg = SYS_MAC_FC_CFG_FC_LINK_SPEED(OCELOT_SPEED_10);
 855                break;
 856        case SPEED_100:
 857                mac_fc_cfg = SYS_MAC_FC_CFG_FC_LINK_SPEED(OCELOT_SPEED_100);
 858                break;
 859        case SPEED_1000:
 860        case SPEED_2500:
 861                mac_fc_cfg = SYS_MAC_FC_CFG_FC_LINK_SPEED(OCELOT_SPEED_1000);
 862                break;
 863        default:
 864                dev_err(ocelot->dev, "Unsupported speed on port %d: %d\n",
 865                        port, speed);
 866                return;
 867        }
 868
 869        /* Handle RX pause in all cases, with 2500base-X this is used for rate
 870         * adaptation.
 871         */
 872        mac_fc_cfg |= SYS_MAC_FC_CFG_RX_FC_ENA;
 873
 874        if (tx_pause)
 875                mac_fc_cfg |= SYS_MAC_FC_CFG_TX_FC_ENA |
 876                              SYS_MAC_FC_CFG_PAUSE_VAL_CFG(0xffff) |
 877                              SYS_MAC_FC_CFG_FC_LATENCY_CFG(0x7) |
 878                              SYS_MAC_FC_CFG_ZERO_PAUSE_ENA;
 879
 880        /* Flow control. Link speed is only used here to evaluate the time
 881         * specification in incoming pause frames.
 882         */
 883        ocelot_write_rix(ocelot, mac_fc_cfg, SYS_MAC_FC_CFG, port);
 884
 885        ocelot_write_rix(ocelot, 0, ANA_POL_FLOWC, port);
 886
 887        /* Don't attempt to send PAUSE frames on the NPI port, it's broken */
 888        if (port != ocelot->npi)
 889                ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_ENA,
 890                                    tx_pause);
 891
 892        /* Undo the effects of ocelot_phylink_mac_link_down:
 893         * enable MAC module
 894         */
 895        ocelot_port_writel(ocelot_port, DEV_MAC_ENA_CFG_RX_ENA |
 896                           DEV_MAC_ENA_CFG_TX_ENA, DEV_MAC_ENA_CFG);
 897
 898        /* If the port supports cut-through forwarding, update the masks before
 899         * enabling forwarding on the port.
 900         */
 901        if (ocelot->ops->cut_through_fwd) {
 902                mutex_lock(&ocelot->fwd_domain_lock);
 903                ocelot->ops->cut_through_fwd(ocelot);
 904                mutex_unlock(&ocelot->fwd_domain_lock);
 905        }
 906
 907        /* Core: Enable port for frame transfer */
 908        ocelot_fields_write(ocelot, port,
 909                            QSYS_SWITCH_PORT_MODE_PORT_ENA, 1);
 910}
 911EXPORT_SYMBOL_GPL(ocelot_phylink_mac_link_up);
 912
 913static int ocelot_port_add_txtstamp_skb(struct ocelot *ocelot, int port,
 914                                        struct sk_buff *clone)
 915{
 916        struct ocelot_port *ocelot_port = ocelot->ports[port];
 917        unsigned long flags;
 918
 919        spin_lock_irqsave(&ocelot->ts_id_lock, flags);
 920
 921        if (ocelot_port->ptp_skbs_in_flight == OCELOT_MAX_PTP_ID ||
 922            ocelot->ptp_skbs_in_flight == OCELOT_PTP_FIFO_SIZE) {
 923                spin_unlock_irqrestore(&ocelot->ts_id_lock, flags);
 924                return -EBUSY;
 925        }
 926
 927        skb_shinfo(clone)->tx_flags |= SKBTX_IN_PROGRESS;
 928        /* Store timestamp ID in OCELOT_SKB_CB(clone)->ts_id */
 929        OCELOT_SKB_CB(clone)->ts_id = ocelot_port->ts_id;
 930
 931        ocelot_port->ts_id++;
 932        if (ocelot_port->ts_id == OCELOT_MAX_PTP_ID)
 933                ocelot_port->ts_id = 0;
 934
 935        ocelot_port->ptp_skbs_in_flight++;
 936        ocelot->ptp_skbs_in_flight++;
 937
 938        skb_queue_tail(&ocelot_port->tx_skbs, clone);
 939
 940        spin_unlock_irqrestore(&ocelot->ts_id_lock, flags);
 941
 942        return 0;
 943}
 944
 945static bool ocelot_ptp_is_onestep_sync(struct sk_buff *skb,
 946                                       unsigned int ptp_class)
 947{
 948        struct ptp_header *hdr;
 949        u8 msgtype, twostep;
 950
 951        hdr = ptp_parse_header(skb, ptp_class);
 952        if (!hdr)
 953                return false;
 954
 955        msgtype = ptp_get_msgtype(hdr, ptp_class);
 956        twostep = hdr->flag_field[0] & 0x2;
 957
 958        if (msgtype == PTP_MSGTYPE_SYNC && twostep == 0)
 959                return true;
 960
 961        return false;
 962}
 963
 964int ocelot_port_txtstamp_request(struct ocelot *ocelot, int port,
 965                                 struct sk_buff *skb,
 966                                 struct sk_buff **clone)
 967{
 968        struct ocelot_port *ocelot_port = ocelot->ports[port];
 969        u8 ptp_cmd = ocelot_port->ptp_cmd;
 970        unsigned int ptp_class;
 971        int err;
 972
 973        /* Don't do anything if PTP timestamping not enabled */
 974        if (!ptp_cmd)
 975                return 0;
 976
 977        ptp_class = ptp_classify_raw(skb);
 978        if (ptp_class == PTP_CLASS_NONE)
 979                return -EINVAL;
 980
 981        /* Store ptp_cmd in OCELOT_SKB_CB(skb)->ptp_cmd */
 982        if (ptp_cmd == IFH_REW_OP_ORIGIN_PTP) {
 983                if (ocelot_ptp_is_onestep_sync(skb, ptp_class)) {
 984                        OCELOT_SKB_CB(skb)->ptp_cmd = ptp_cmd;
 985                        return 0;
 986                }
 987
 988                /* Fall back to two-step timestamping */
 989                ptp_cmd = IFH_REW_OP_TWO_STEP_PTP;
 990        }
 991
 992        if (ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) {
 993                *clone = skb_clone_sk(skb);
 994                if (!(*clone))
 995                        return -ENOMEM;
 996
 997                err = ocelot_port_add_txtstamp_skb(ocelot, port, *clone);
 998                if (err)
 999                        return err;
1000
1001                OCELOT_SKB_CB(skb)->ptp_cmd = ptp_cmd;
1002                OCELOT_SKB_CB(*clone)->ptp_class = ptp_class;
1003        }
1004
1005        return 0;
1006}
1007EXPORT_SYMBOL(ocelot_port_txtstamp_request);
1008
1009static void ocelot_get_hwtimestamp(struct ocelot *ocelot,
1010                                   struct timespec64 *ts)
1011{
1012        unsigned long flags;
1013        u32 val;
1014
1015        spin_lock_irqsave(&ocelot->ptp_clock_lock, flags);
1016
1017        /* Read current PTP time to get seconds */
1018        val = ocelot_read_rix(ocelot, PTP_PIN_CFG, TOD_ACC_PIN);
1019
1020        val &= ~(PTP_PIN_CFG_SYNC | PTP_PIN_CFG_ACTION_MASK | PTP_PIN_CFG_DOM);
1021        val |= PTP_PIN_CFG_ACTION(PTP_PIN_ACTION_SAVE);
1022        ocelot_write_rix(ocelot, val, PTP_PIN_CFG, TOD_ACC_PIN);
1023        ts->tv_sec = ocelot_read_rix(ocelot, PTP_PIN_TOD_SEC_LSB, TOD_ACC_PIN);
1024
1025        /* Read packet HW timestamp from FIFO */
1026        val = ocelot_read(ocelot, SYS_PTP_TXSTAMP);
1027        ts->tv_nsec = SYS_PTP_TXSTAMP_PTP_TXSTAMP(val);
1028
1029        /* Sec has incremented since the ts was registered */
1030        if ((ts->tv_sec & 0x1) != !!(val & SYS_PTP_TXSTAMP_PTP_TXSTAMP_SEC))
1031                ts->tv_sec--;
1032
1033        spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags);
1034}
1035
1036static bool ocelot_validate_ptp_skb(struct sk_buff *clone, u16 seqid)
1037{
1038        struct ptp_header *hdr;
1039
1040        hdr = ptp_parse_header(clone, OCELOT_SKB_CB(clone)->ptp_class);
1041        if (WARN_ON(!hdr))
1042                return false;
1043
1044        return seqid == ntohs(hdr->sequence_id);
1045}
1046
1047void ocelot_get_txtstamp(struct ocelot *ocelot)
1048{
1049        int budget = OCELOT_PTP_QUEUE_SZ;
1050
1051        while (budget--) {
1052                struct sk_buff *skb, *skb_tmp, *skb_match = NULL;
1053                struct skb_shared_hwtstamps shhwtstamps;
1054                u32 val, id, seqid, txport;
1055                struct ocelot_port *port;
1056                struct timespec64 ts;
1057                unsigned long flags;
1058
1059                val = ocelot_read(ocelot, SYS_PTP_STATUS);
1060
1061                /* Check if a timestamp can be retrieved */
1062                if (!(val & SYS_PTP_STATUS_PTP_MESS_VLD))
1063                        break;
1064
1065                WARN_ON(val & SYS_PTP_STATUS_PTP_OVFL);
1066
1067                /* Retrieve the ts ID and Tx port */
1068                id = SYS_PTP_STATUS_PTP_MESS_ID_X(val);
1069                txport = SYS_PTP_STATUS_PTP_MESS_TXPORT_X(val);
1070                seqid = SYS_PTP_STATUS_PTP_MESS_SEQ_ID(val);
1071
1072                port = ocelot->ports[txport];
1073
1074                spin_lock(&ocelot->ts_id_lock);
1075                port->ptp_skbs_in_flight--;
1076                ocelot->ptp_skbs_in_flight--;
1077                spin_unlock(&ocelot->ts_id_lock);
1078
1079                /* Retrieve its associated skb */
1080try_again:
1081                spin_lock_irqsave(&port->tx_skbs.lock, flags);
1082
1083                skb_queue_walk_safe(&port->tx_skbs, skb, skb_tmp) {
1084                        if (OCELOT_SKB_CB(skb)->ts_id != id)
1085                                continue;
1086                        __skb_unlink(skb, &port->tx_skbs);
1087                        skb_match = skb;
1088                        break;
1089                }
1090
1091                spin_unlock_irqrestore(&port->tx_skbs.lock, flags);
1092
1093                if (WARN_ON(!skb_match))
1094                        continue;
1095
1096                if (!ocelot_validate_ptp_skb(skb_match, seqid)) {
1097                        dev_err_ratelimited(ocelot->dev,
1098                                            "port %d received stale TX timestamp for seqid %d, discarding\n",
1099                                            txport, seqid);
1100                        dev_kfree_skb_any(skb);
1101                        goto try_again;
1102                }
1103
1104                /* Get the h/w timestamp */
1105                ocelot_get_hwtimestamp(ocelot, &ts);
1106
1107                /* Set the timestamp into the skb */
1108                memset(&shhwtstamps, 0, sizeof(shhwtstamps));
1109                shhwtstamps.hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec);
1110                skb_complete_tx_timestamp(skb_match, &shhwtstamps);
1111
1112                /* Next ts */
1113                ocelot_write(ocelot, SYS_PTP_NXT_PTP_NXT, SYS_PTP_NXT);
1114        }
1115}
1116EXPORT_SYMBOL(ocelot_get_txtstamp);
1117
1118static int ocelot_rx_frame_word(struct ocelot *ocelot, u8 grp, bool ifh,
1119                                u32 *rval)
1120{
1121        u32 bytes_valid, val;
1122
1123        val = ocelot_read_rix(ocelot, QS_XTR_RD, grp);
1124        if (val == XTR_NOT_READY) {
1125                if (ifh)
1126                        return -EIO;
1127
1128                do {
1129                        val = ocelot_read_rix(ocelot, QS_XTR_RD, grp);
1130                } while (val == XTR_NOT_READY);
1131        }
1132
1133        switch (val) {
1134        case XTR_ABORT:
1135                return -EIO;
1136        case XTR_EOF_0:
1137        case XTR_EOF_1:
1138        case XTR_EOF_2:
1139        case XTR_EOF_3:
1140        case XTR_PRUNED:
1141                bytes_valid = XTR_VALID_BYTES(val);
1142                val = ocelot_read_rix(ocelot, QS_XTR_RD, grp);
1143                if (val == XTR_ESCAPE)
1144                        *rval = ocelot_read_rix(ocelot, QS_XTR_RD, grp);
1145                else
1146                        *rval = val;
1147
1148                return bytes_valid;
1149        case XTR_ESCAPE:
1150                *rval = ocelot_read_rix(ocelot, QS_XTR_RD, grp);
1151
1152                return 4;
1153        default:
1154                *rval = val;
1155
1156                return 4;
1157        }
1158}
1159
1160static int ocelot_xtr_poll_xfh(struct ocelot *ocelot, int grp, u32 *xfh)
1161{
1162        int i, err = 0;
1163
1164        for (i = 0; i < OCELOT_TAG_LEN / 4; i++) {
1165                err = ocelot_rx_frame_word(ocelot, grp, true, &xfh[i]);
1166                if (err != 4)
1167                        return (err < 0) ? err : -EIO;
1168        }
1169
1170        return 0;
1171}
1172
1173void ocelot_ptp_rx_timestamp(struct ocelot *ocelot, struct sk_buff *skb,
1174                             u64 timestamp)
1175{
1176        struct skb_shared_hwtstamps *shhwtstamps;
1177        u64 tod_in_ns, full_ts_in_ns;
1178        struct timespec64 ts;
1179
1180        ocelot_ptp_gettime64(&ocelot->ptp_info, &ts);
1181
1182        tod_in_ns = ktime_set(ts.tv_sec, ts.tv_nsec);
1183        if ((tod_in_ns & 0xffffffff) < timestamp)
1184                full_ts_in_ns = (((tod_in_ns >> 32) - 1) << 32) |
1185                                timestamp;
1186        else
1187                full_ts_in_ns = (tod_in_ns & GENMASK_ULL(63, 32)) |
1188                                timestamp;
1189
1190        shhwtstamps = skb_hwtstamps(skb);
1191        memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps));
1192        shhwtstamps->hwtstamp = full_ts_in_ns;
1193}
1194EXPORT_SYMBOL(ocelot_ptp_rx_timestamp);
1195
1196int ocelot_xtr_poll_frame(struct ocelot *ocelot, int grp, struct sk_buff **nskb)
1197{
1198        u64 timestamp, src_port, len;
1199        u32 xfh[OCELOT_TAG_LEN / 4];
1200        struct net_device *dev;
1201        struct sk_buff *skb;
1202        int sz, buf_len;
1203        u32 val, *buf;
1204        int err;
1205
1206        err = ocelot_xtr_poll_xfh(ocelot, grp, xfh);
1207        if (err)
1208                return err;
1209
1210        ocelot_xfh_get_src_port(xfh, &src_port);
1211        ocelot_xfh_get_len(xfh, &len);
1212        ocelot_xfh_get_rew_val(xfh, &timestamp);
1213
1214        if (WARN_ON(src_port >= ocelot->num_phys_ports))
1215                return -EINVAL;
1216
1217        dev = ocelot->ops->port_to_netdev(ocelot, src_port);
1218        if (!dev)
1219                return -EINVAL;
1220
1221        skb = netdev_alloc_skb(dev, len);
1222        if (unlikely(!skb)) {
1223                netdev_err(dev, "Unable to allocate sk_buff\n");
1224                return -ENOMEM;
1225        }
1226
1227        buf_len = len - ETH_FCS_LEN;
1228        buf = (u32 *)skb_put(skb, buf_len);
1229
1230        len = 0;
1231        do {
1232                sz = ocelot_rx_frame_word(ocelot, grp, false, &val);
1233                if (sz < 0) {
1234                        err = sz;
1235                        goto out_free_skb;
1236                }
1237                *buf++ = val;
1238                len += sz;
1239        } while (len < buf_len);
1240
1241        /* Read the FCS */
1242        sz = ocelot_rx_frame_word(ocelot, grp, false, &val);
1243        if (sz < 0) {
1244                err = sz;
1245                goto out_free_skb;
1246        }
1247
1248        /* Update the statistics if part of the FCS was read before */
1249        len -= ETH_FCS_LEN - sz;
1250
1251        if (unlikely(dev->features & NETIF_F_RXFCS)) {
1252                buf = (u32 *)skb_put(skb, ETH_FCS_LEN);
1253                *buf = val;
1254        }
1255
1256        if (ocelot->ptp)
1257                ocelot_ptp_rx_timestamp(ocelot, skb, timestamp);
1258
1259        /* Everything we see on an interface that is in the HW bridge
1260         * has already been forwarded.
1261         */
1262        if (ocelot->ports[src_port]->bridge)
1263                skb->offload_fwd_mark = 1;
1264
1265        skb->protocol = eth_type_trans(skb, dev);
1266
1267        *nskb = skb;
1268
1269        return 0;
1270
1271out_free_skb:
1272        kfree_skb(skb);
1273        return err;
1274}
1275EXPORT_SYMBOL(ocelot_xtr_poll_frame);
1276
1277bool ocelot_can_inject(struct ocelot *ocelot, int grp)
1278{
1279        u32 val = ocelot_read(ocelot, QS_INJ_STATUS);
1280
1281        if (!(val & QS_INJ_STATUS_FIFO_RDY(BIT(grp))))
1282                return false;
1283        if (val & QS_INJ_STATUS_WMARK_REACHED(BIT(grp)))
1284                return false;
1285
1286        return true;
1287}
1288EXPORT_SYMBOL(ocelot_can_inject);
1289
1290void ocelot_ifh_port_set(void *ifh, int port, u32 rew_op, u32 vlan_tag)
1291{
1292        ocelot_ifh_set_bypass(ifh, 1);
1293        ocelot_ifh_set_dest(ifh, BIT_ULL(port));
1294        ocelot_ifh_set_tag_type(ifh, IFH_TAG_TYPE_C);
1295        if (vlan_tag)
1296                ocelot_ifh_set_vlan_tci(ifh, vlan_tag);
1297        if (rew_op)
1298                ocelot_ifh_set_rew_op(ifh, rew_op);
1299}
1300EXPORT_SYMBOL(ocelot_ifh_port_set);
1301
1302void ocelot_port_inject_frame(struct ocelot *ocelot, int port, int grp,
1303                              u32 rew_op, struct sk_buff *skb)
1304{
1305        u32 ifh[OCELOT_TAG_LEN / 4] = {0};
1306        unsigned int i, count, last;
1307
1308        ocelot_write_rix(ocelot, QS_INJ_CTRL_GAP_SIZE(1) |
1309                         QS_INJ_CTRL_SOF, QS_INJ_CTRL, grp);
1310
1311        ocelot_ifh_port_set(ifh, port, rew_op, skb_vlan_tag_get(skb));
1312
1313        for (i = 0; i < OCELOT_TAG_LEN / 4; i++)
1314                ocelot_write_rix(ocelot, ifh[i], QS_INJ_WR, grp);
1315
1316        count = DIV_ROUND_UP(skb->len, 4);
1317        last = skb->len % 4;
1318        for (i = 0; i < count; i++)
1319                ocelot_write_rix(ocelot, ((u32 *)skb->data)[i], QS_INJ_WR, grp);
1320
1321        /* Add padding */
1322        while (i < (OCELOT_BUFFER_CELL_SZ / 4)) {
1323                ocelot_write_rix(ocelot, 0, QS_INJ_WR, grp);
1324                i++;
1325        }
1326
1327        /* Indicate EOF and valid bytes in last word */
1328        ocelot_write_rix(ocelot, QS_INJ_CTRL_GAP_SIZE(1) |
1329                         QS_INJ_CTRL_VLD_BYTES(skb->len < OCELOT_BUFFER_CELL_SZ ? 0 : last) |
1330                         QS_INJ_CTRL_EOF,
1331                         QS_INJ_CTRL, grp);
1332
1333        /* Add dummy CRC */
1334        ocelot_write_rix(ocelot, 0, QS_INJ_WR, grp);
1335        skb_tx_timestamp(skb);
1336
1337        skb->dev->stats.tx_packets++;
1338        skb->dev->stats.tx_bytes += skb->len;
1339}
1340EXPORT_SYMBOL(ocelot_port_inject_frame);
1341
1342void ocelot_drain_cpu_queue(struct ocelot *ocelot, int grp)
1343{
1344        while (ocelot_read(ocelot, QS_XTR_DATA_PRESENT) & BIT(grp))
1345                ocelot_read_rix(ocelot, QS_XTR_RD, grp);
1346}
1347EXPORT_SYMBOL(ocelot_drain_cpu_queue);
1348
1349int ocelot_fdb_add(struct ocelot *ocelot, int port, const unsigned char *addr,
1350                   u16 vid, const struct net_device *bridge)
1351{
1352        int pgid = port;
1353
1354        if (port == ocelot->npi)
1355                pgid = PGID_CPU;
1356
1357        if (!vid)
1358                vid = ocelot_vlan_unaware_pvid(ocelot, bridge);
1359
1360        return ocelot_mact_learn(ocelot, pgid, addr, vid, ENTRYTYPE_LOCKED);
1361}
1362EXPORT_SYMBOL(ocelot_fdb_add);
1363
1364int ocelot_fdb_del(struct ocelot *ocelot, int port, const unsigned char *addr,
1365                   u16 vid, const struct net_device *bridge)
1366{
1367        if (!vid)
1368                vid = ocelot_vlan_unaware_pvid(ocelot, bridge);
1369
1370        return ocelot_mact_forget(ocelot, addr, vid);
1371}
1372EXPORT_SYMBOL(ocelot_fdb_del);
1373
1374int ocelot_port_fdb_do_dump(const unsigned char *addr, u16 vid,
1375                            bool is_static, void *data)
1376{
1377        struct ocelot_dump_ctx *dump = data;
1378        u32 portid = NETLINK_CB(dump->cb->skb).portid;
1379        u32 seq = dump->cb->nlh->nlmsg_seq;
1380        struct nlmsghdr *nlh;
1381        struct ndmsg *ndm;
1382
1383        if (dump->idx < dump->cb->args[2])
1384                goto skip;
1385
1386        nlh = nlmsg_put(dump->skb, portid, seq, RTM_NEWNEIGH,
1387                        sizeof(*ndm), NLM_F_MULTI);
1388        if (!nlh)
1389                return -EMSGSIZE;
1390
1391        ndm = nlmsg_data(nlh);
1392        ndm->ndm_family  = AF_BRIDGE;
1393        ndm->ndm_pad1    = 0;
1394        ndm->ndm_pad2    = 0;
1395        ndm->ndm_flags   = NTF_SELF;
1396        ndm->ndm_type    = 0;
1397        ndm->ndm_ifindex = dump->dev->ifindex;
1398        ndm->ndm_state   = is_static ? NUD_NOARP : NUD_REACHABLE;
1399
1400        if (nla_put(dump->skb, NDA_LLADDR, ETH_ALEN, addr))
1401                goto nla_put_failure;
1402
1403        if (vid && nla_put_u16(dump->skb, NDA_VLAN, vid))
1404                goto nla_put_failure;
1405
1406        nlmsg_end(dump->skb, nlh);
1407
1408skip:
1409        dump->idx++;
1410        return 0;
1411
1412nla_put_failure:
1413        nlmsg_cancel(dump->skb, nlh);
1414        return -EMSGSIZE;
1415}
1416EXPORT_SYMBOL(ocelot_port_fdb_do_dump);
1417
1418/* Caller must hold &ocelot->mact_lock */
1419static int ocelot_mact_read(struct ocelot *ocelot, int port, int row, int col,
1420                            struct ocelot_mact_entry *entry)
1421{
1422        u32 val, dst, macl, mach;
1423        char mac[ETH_ALEN];
1424
1425        /* Set row and column to read from */
1426        ocelot_field_write(ocelot, ANA_TABLES_MACTINDX_M_INDEX, row);
1427        ocelot_field_write(ocelot, ANA_TABLES_MACTINDX_BUCKET, col);
1428
1429        /* Issue a read command */
1430        ocelot_write(ocelot,
1431                     ANA_TABLES_MACACCESS_MAC_TABLE_CMD(MACACCESS_CMD_READ),
1432                     ANA_TABLES_MACACCESS);
1433
1434        if (ocelot_mact_wait_for_completion(ocelot))
1435                return -ETIMEDOUT;
1436
1437        /* Read the entry flags */
1438        val = ocelot_read(ocelot, ANA_TABLES_MACACCESS);
1439        if (!(val & ANA_TABLES_MACACCESS_VALID))
1440                return -EINVAL;
1441
1442        /* If the entry read has another port configured as its destination,
1443         * do not report it.
1444         */
1445        dst = (val & ANA_TABLES_MACACCESS_DEST_IDX_M) >> 3;
1446        if (dst != port)
1447                return -EINVAL;
1448
1449        /* Get the entry's MAC address and VLAN id */
1450        macl = ocelot_read(ocelot, ANA_TABLES_MACLDATA);
1451        mach = ocelot_read(ocelot, ANA_TABLES_MACHDATA);
1452
1453        mac[0] = (mach >> 8)  & 0xff;
1454        mac[1] = (mach >> 0)  & 0xff;
1455        mac[2] = (macl >> 24) & 0xff;
1456        mac[3] = (macl >> 16) & 0xff;
1457        mac[4] = (macl >> 8)  & 0xff;
1458        mac[5] = (macl >> 0)  & 0xff;
1459
1460        entry->vid = (mach >> 16) & 0xfff;
1461        ether_addr_copy(entry->mac, mac);
1462
1463        return 0;
1464}
1465
1466int ocelot_mact_flush(struct ocelot *ocelot, int port)
1467{
1468        int err;
1469
1470        mutex_lock(&ocelot->mact_lock);
1471
1472        /* Program ageing filter for a single port */
1473        ocelot_write(ocelot, ANA_ANAGEFIL_PID_EN | ANA_ANAGEFIL_PID_VAL(port),
1474                     ANA_ANAGEFIL);
1475
1476        /* Flushing dynamic FDB entries requires two successive age scans */
1477        ocelot_write(ocelot,
1478                     ANA_TABLES_MACACCESS_MAC_TABLE_CMD(MACACCESS_CMD_AGE),
1479                     ANA_TABLES_MACACCESS);
1480
1481        err = ocelot_mact_wait_for_completion(ocelot);
1482        if (err) {
1483                mutex_unlock(&ocelot->mact_lock);
1484                return err;
1485        }
1486
1487        /* And second... */
1488        ocelot_write(ocelot,
1489                     ANA_TABLES_MACACCESS_MAC_TABLE_CMD(MACACCESS_CMD_AGE),
1490                     ANA_TABLES_MACACCESS);
1491
1492        err = ocelot_mact_wait_for_completion(ocelot);
1493
1494        /* Restore ageing filter */
1495        ocelot_write(ocelot, 0, ANA_ANAGEFIL);
1496
1497        mutex_unlock(&ocelot->mact_lock);
1498
1499        return err;
1500}
1501EXPORT_SYMBOL_GPL(ocelot_mact_flush);
1502
1503int ocelot_fdb_dump(struct ocelot *ocelot, int port,
1504                    dsa_fdb_dump_cb_t *cb, void *data)
1505{
1506        int err = 0;
1507        int i, j;
1508
1509        /* We could take the lock just around ocelot_mact_read, but doing so
1510         * thousands of times in a row seems rather pointless and inefficient.
1511         */
1512        mutex_lock(&ocelot->mact_lock);
1513
1514        /* Loop through all the mac tables entries. */
1515        for (i = 0; i < ocelot->num_mact_rows; i++) {
1516                for (j = 0; j < 4; j++) {
1517                        struct ocelot_mact_entry entry;
1518                        bool is_static;
1519
1520                        err = ocelot_mact_read(ocelot, port, i, j, &entry);
1521                        /* If the entry is invalid (wrong port, invalid...),
1522                         * skip it.
1523                         */
1524                        if (err == -EINVAL)
1525                                continue;
1526                        else if (err)
1527                                break;
1528
1529                        is_static = (entry.type == ENTRYTYPE_LOCKED);
1530
1531                        /* Hide the reserved VLANs used for
1532                         * VLAN-unaware bridging.
1533                         */
1534                        if (entry.vid > OCELOT_RSV_VLAN_RANGE_START)
1535                                entry.vid = 0;
1536
1537                        err = cb(entry.mac, entry.vid, is_static, data);
1538                        if (err)
1539                                break;
1540                }
1541        }
1542
1543        mutex_unlock(&ocelot->mact_lock);
1544
1545        return err;
1546}
1547EXPORT_SYMBOL(ocelot_fdb_dump);
1548
1549static void ocelot_populate_l2_ptp_trap_key(struct ocelot_vcap_filter *trap)
1550{
1551        trap->key_type = OCELOT_VCAP_KEY_ETYPE;
1552        *(__be16 *)trap->key.etype.etype.value = htons(ETH_P_1588);
1553        *(__be16 *)trap->key.etype.etype.mask = htons(0xffff);
1554}
1555
1556static void
1557ocelot_populate_ipv4_ptp_event_trap_key(struct ocelot_vcap_filter *trap)
1558{
1559        trap->key_type = OCELOT_VCAP_KEY_IPV4;
1560        trap->key.ipv4.proto.value[0] = IPPROTO_UDP;
1561        trap->key.ipv4.proto.mask[0] = 0xff;
1562        trap->key.ipv4.dport.value = PTP_EV_PORT;
1563        trap->key.ipv4.dport.mask = 0xffff;
1564}
1565
1566static void
1567ocelot_populate_ipv6_ptp_event_trap_key(struct ocelot_vcap_filter *trap)
1568{
1569        trap->key_type = OCELOT_VCAP_KEY_IPV6;
1570        trap->key.ipv4.proto.value[0] = IPPROTO_UDP;
1571        trap->key.ipv4.proto.mask[0] = 0xff;
1572        trap->key.ipv6.dport.value = PTP_EV_PORT;
1573        trap->key.ipv6.dport.mask = 0xffff;
1574}
1575
1576static void
1577ocelot_populate_ipv4_ptp_general_trap_key(struct ocelot_vcap_filter *trap)
1578{
1579        trap->key_type = OCELOT_VCAP_KEY_IPV4;
1580        trap->key.ipv4.proto.value[0] = IPPROTO_UDP;
1581        trap->key.ipv4.proto.mask[0] = 0xff;
1582        trap->key.ipv4.dport.value = PTP_GEN_PORT;
1583        trap->key.ipv4.dport.mask = 0xffff;
1584}
1585
1586static void
1587ocelot_populate_ipv6_ptp_general_trap_key(struct ocelot_vcap_filter *trap)
1588{
1589        trap->key_type = OCELOT_VCAP_KEY_IPV6;
1590        trap->key.ipv4.proto.value[0] = IPPROTO_UDP;
1591        trap->key.ipv4.proto.mask[0] = 0xff;
1592        trap->key.ipv6.dport.value = PTP_GEN_PORT;
1593        trap->key.ipv6.dport.mask = 0xffff;
1594}
1595
1596int ocelot_trap_add(struct ocelot *ocelot, int port,
1597                    unsigned long cookie, bool take_ts,
1598                    void (*populate)(struct ocelot_vcap_filter *f))
1599{
1600        struct ocelot_vcap_block *block_vcap_is2;
1601        struct ocelot_vcap_filter *trap;
1602        bool new = false;
1603        int err;
1604
1605        block_vcap_is2 = &ocelot->block[VCAP_IS2];
1606
1607        trap = ocelot_vcap_block_find_filter_by_id(block_vcap_is2, cookie,
1608                                                   false);
1609        if (!trap) {
1610                trap = kzalloc(sizeof(*trap), GFP_KERNEL);
1611                if (!trap)
1612                        return -ENOMEM;
1613
1614                populate(trap);
1615                trap->prio = 1;
1616                trap->id.cookie = cookie;
1617                trap->id.tc_offload = false;
1618                trap->block_id = VCAP_IS2;
1619                trap->type = OCELOT_VCAP_FILTER_OFFLOAD;
1620                trap->lookup = 0;
1621                trap->action.cpu_copy_ena = true;
1622                trap->action.mask_mode = OCELOT_MASK_MODE_PERMIT_DENY;
1623                trap->action.port_mask = 0;
1624                trap->take_ts = take_ts;
1625                trap->is_trap = true;
1626                new = true;
1627        }
1628
1629        trap->ingress_port_mask |= BIT(port);
1630
1631        if (new)
1632                err = ocelot_vcap_filter_add(ocelot, trap, NULL);
1633        else
1634                err = ocelot_vcap_filter_replace(ocelot, trap);
1635        if (err) {
1636                trap->ingress_port_mask &= ~BIT(port);
1637                if (!trap->ingress_port_mask)
1638                        kfree(trap);
1639                return err;
1640        }
1641
1642        return 0;
1643}
1644
1645int ocelot_trap_del(struct ocelot *ocelot, int port, unsigned long cookie)
1646{
1647        struct ocelot_vcap_block *block_vcap_is2;
1648        struct ocelot_vcap_filter *trap;
1649
1650        block_vcap_is2 = &ocelot->block[VCAP_IS2];
1651
1652        trap = ocelot_vcap_block_find_filter_by_id(block_vcap_is2, cookie,
1653                                                   false);
1654        if (!trap)
1655                return 0;
1656
1657        trap->ingress_port_mask &= ~BIT(port);
1658        if (!trap->ingress_port_mask)
1659                return ocelot_vcap_filter_del(ocelot, trap);
1660
1661        return ocelot_vcap_filter_replace(ocelot, trap);
1662}
1663
1664static int ocelot_l2_ptp_trap_add(struct ocelot *ocelot, int port)
1665{
1666        unsigned long l2_cookie = OCELOT_VCAP_IS2_L2_PTP_TRAP(ocelot);
1667
1668        return ocelot_trap_add(ocelot, port, l2_cookie, true,
1669                               ocelot_populate_l2_ptp_trap_key);
1670}
1671
1672static int ocelot_l2_ptp_trap_del(struct ocelot *ocelot, int port)
1673{
1674        unsigned long l2_cookie = OCELOT_VCAP_IS2_L2_PTP_TRAP(ocelot);
1675
1676        return ocelot_trap_del(ocelot, port, l2_cookie);
1677}
1678
1679static int ocelot_ipv4_ptp_trap_add(struct ocelot *ocelot, int port)
1680{
1681        unsigned long ipv4_gen_cookie = OCELOT_VCAP_IS2_IPV4_GEN_PTP_TRAP(ocelot);
1682        unsigned long ipv4_ev_cookie = OCELOT_VCAP_IS2_IPV4_EV_PTP_TRAP(ocelot);
1683        int err;
1684
1685        err = ocelot_trap_add(ocelot, port, ipv4_ev_cookie, true,
1686                              ocelot_populate_ipv4_ptp_event_trap_key);
1687        if (err)
1688                return err;
1689
1690        err = ocelot_trap_add(ocelot, port, ipv4_gen_cookie, false,
1691                              ocelot_populate_ipv4_ptp_general_trap_key);
1692        if (err)
1693                ocelot_trap_del(ocelot, port, ipv4_ev_cookie);
1694
1695        return err;
1696}
1697
1698static int ocelot_ipv4_ptp_trap_del(struct ocelot *ocelot, int port)
1699{
1700        unsigned long ipv4_gen_cookie = OCELOT_VCAP_IS2_IPV4_GEN_PTP_TRAP(ocelot);
1701        unsigned long ipv4_ev_cookie = OCELOT_VCAP_IS2_IPV4_EV_PTP_TRAP(ocelot);
1702        int err;
1703
1704        err = ocelot_trap_del(ocelot, port, ipv4_ev_cookie);
1705        err |= ocelot_trap_del(ocelot, port, ipv4_gen_cookie);
1706        return err;
1707}
1708
1709static int ocelot_ipv6_ptp_trap_add(struct ocelot *ocelot, int port)
1710{
1711        unsigned long ipv6_gen_cookie = OCELOT_VCAP_IS2_IPV6_GEN_PTP_TRAP(ocelot);
1712        unsigned long ipv6_ev_cookie = OCELOT_VCAP_IS2_IPV6_EV_PTP_TRAP(ocelot);
1713        int err;
1714
1715        err = ocelot_trap_add(ocelot, port, ipv6_ev_cookie, true,
1716                              ocelot_populate_ipv6_ptp_event_trap_key);
1717        if (err)
1718                return err;
1719
1720        err = ocelot_trap_add(ocelot, port, ipv6_gen_cookie, false,
1721                              ocelot_populate_ipv6_ptp_general_trap_key);
1722        if (err)
1723                ocelot_trap_del(ocelot, port, ipv6_ev_cookie);
1724
1725        return err;
1726}
1727
1728static int ocelot_ipv6_ptp_trap_del(struct ocelot *ocelot, int port)
1729{
1730        unsigned long ipv6_gen_cookie = OCELOT_VCAP_IS2_IPV6_GEN_PTP_TRAP(ocelot);
1731        unsigned long ipv6_ev_cookie = OCELOT_VCAP_IS2_IPV6_EV_PTP_TRAP(ocelot);
1732        int err;
1733
1734        err = ocelot_trap_del(ocelot, port, ipv6_ev_cookie);
1735        err |= ocelot_trap_del(ocelot, port, ipv6_gen_cookie);
1736        return err;
1737}
1738
1739static int ocelot_setup_ptp_traps(struct ocelot *ocelot, int port,
1740                                  bool l2, bool l4)
1741{
1742        int err;
1743
1744        if (l2)
1745                err = ocelot_l2_ptp_trap_add(ocelot, port);
1746        else
1747                err = ocelot_l2_ptp_trap_del(ocelot, port);
1748        if (err)
1749                return err;
1750
1751        if (l4) {
1752                err = ocelot_ipv4_ptp_trap_add(ocelot, port);
1753                if (err)
1754                        goto err_ipv4;
1755
1756                err = ocelot_ipv6_ptp_trap_add(ocelot, port);
1757                if (err)
1758                        goto err_ipv6;
1759        } else {
1760                err = ocelot_ipv4_ptp_trap_del(ocelot, port);
1761
1762                err |= ocelot_ipv6_ptp_trap_del(ocelot, port);
1763        }
1764        if (err)
1765                return err;
1766
1767        return 0;
1768
1769err_ipv6:
1770        ocelot_ipv4_ptp_trap_del(ocelot, port);
1771err_ipv4:
1772        if (l2)
1773                ocelot_l2_ptp_trap_del(ocelot, port);
1774        return err;
1775}
1776
1777int ocelot_hwstamp_get(struct ocelot *ocelot, int port, struct ifreq *ifr)
1778{
1779        return copy_to_user(ifr->ifr_data, &ocelot->hwtstamp_config,
1780                            sizeof(ocelot->hwtstamp_config)) ? -EFAULT : 0;
1781}
1782EXPORT_SYMBOL(ocelot_hwstamp_get);
1783
1784int ocelot_hwstamp_set(struct ocelot *ocelot, int port, struct ifreq *ifr)
1785{
1786        struct ocelot_port *ocelot_port = ocelot->ports[port];
1787        bool l2 = false, l4 = false;
1788        struct hwtstamp_config cfg;
1789        int err;
1790
1791        if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
1792                return -EFAULT;
1793
1794        /* Tx type sanity check */
1795        switch (cfg.tx_type) {
1796        case HWTSTAMP_TX_ON:
1797                ocelot_port->ptp_cmd = IFH_REW_OP_TWO_STEP_PTP;
1798                break;
1799        case HWTSTAMP_TX_ONESTEP_SYNC:
1800                /* IFH_REW_OP_ONE_STEP_PTP updates the correctional field, we
1801                 * need to update the origin time.
1802                 */
1803                ocelot_port->ptp_cmd = IFH_REW_OP_ORIGIN_PTP;
1804                break;
1805        case HWTSTAMP_TX_OFF:
1806                ocelot_port->ptp_cmd = 0;
1807                break;
1808        default:
1809                return -ERANGE;
1810        }
1811
1812        mutex_lock(&ocelot->ptp_lock);
1813
1814        switch (cfg.rx_filter) {
1815        case HWTSTAMP_FILTER_NONE:
1816                break;
1817        case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
1818        case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
1819        case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
1820                l4 = true;
1821                break;
1822        case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
1823        case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
1824        case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
1825                l2 = true;
1826                break;
1827        case HWTSTAMP_FILTER_PTP_V2_EVENT:
1828        case HWTSTAMP_FILTER_PTP_V2_SYNC:
1829        case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
1830                l2 = true;
1831                l4 = true;
1832                break;
1833        default:
1834                mutex_unlock(&ocelot->ptp_lock);
1835                return -ERANGE;
1836        }
1837
1838        err = ocelot_setup_ptp_traps(ocelot, port, l2, l4);
1839        if (err) {
1840                mutex_unlock(&ocelot->ptp_lock);
1841                return err;
1842        }
1843
1844        if (l2 && l4)
1845                cfg.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
1846        else if (l2)
1847                cfg.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
1848        else if (l4)
1849                cfg.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
1850        else
1851                cfg.rx_filter = HWTSTAMP_FILTER_NONE;
1852
1853        /* Commit back the result & save it */
1854        memcpy(&ocelot->hwtstamp_config, &cfg, sizeof(cfg));
1855        mutex_unlock(&ocelot->ptp_lock);
1856
1857        return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0;
1858}
1859EXPORT_SYMBOL(ocelot_hwstamp_set);
1860
1861void ocelot_get_strings(struct ocelot *ocelot, int port, u32 sset, u8 *data)
1862{
1863        int i;
1864
1865        if (sset != ETH_SS_STATS)
1866                return;
1867
1868        for (i = 0; i < ocelot->num_stats; i++)
1869                memcpy(data + i * ETH_GSTRING_LEN, ocelot->stats_layout[i].name,
1870                       ETH_GSTRING_LEN);
1871}
1872EXPORT_SYMBOL(ocelot_get_strings);
1873
1874/* Caller must hold &ocelot->stats_lock */
1875static int ocelot_port_update_stats(struct ocelot *ocelot, int port)
1876{
1877        unsigned int idx = port * ocelot->num_stats;
1878        struct ocelot_stats_region *region;
1879        int err, j;
1880
1881        /* Configure the port to read the stats from */
1882        ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(port), SYS_STAT_CFG);
1883
1884        list_for_each_entry(region, &ocelot->stats_regions, node) {
1885                err = ocelot_bulk_read_rix(ocelot, SYS_COUNT_RX_OCTETS,
1886                                           region->offset, region->buf,
1887                                           region->count);
1888                if (err)
1889                        return err;
1890
1891                for (j = 0; j < region->count; j++) {
1892                        u64 *stat = &ocelot->stats[idx + j];
1893                        u64 val = region->buf[j];
1894
1895                        if (val < (*stat & U32_MAX))
1896                                *stat += (u64)1 << 32;
1897
1898                        *stat = (*stat & ~(u64)U32_MAX) + val;
1899                }
1900
1901                idx += region->count;
1902        }
1903
1904        return err;
1905}
1906
1907static void ocelot_check_stats_work(struct work_struct *work)
1908{
1909        struct delayed_work *del_work = to_delayed_work(work);
1910        struct ocelot *ocelot = container_of(del_work, struct ocelot,
1911                                             stats_work);
1912        int i, err;
1913
1914        mutex_lock(&ocelot->stats_lock);
1915        for (i = 0; i < ocelot->num_phys_ports; i++) {
1916                err = ocelot_port_update_stats(ocelot, i);
1917                if (err)
1918                        break;
1919        }
1920        mutex_unlock(&ocelot->stats_lock);
1921
1922        if (err)
1923                dev_err(ocelot->dev, "Error %d updating ethtool stats\n",  err);
1924
1925        queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work,
1926                           OCELOT_STATS_CHECK_DELAY);
1927}
1928
1929void ocelot_get_ethtool_stats(struct ocelot *ocelot, int port, u64 *data)
1930{
1931        int i, err;
1932
1933        mutex_lock(&ocelot->stats_lock);
1934
1935        /* check and update now */
1936        err = ocelot_port_update_stats(ocelot, port);
1937
1938        /* Copy all counters */
1939        for (i = 0; i < ocelot->num_stats; i++)
1940                *data++ = ocelot->stats[port * ocelot->num_stats + i];
1941
1942        mutex_unlock(&ocelot->stats_lock);
1943
1944        if (err)
1945                dev_err(ocelot->dev, "Error %d updating ethtool stats\n", err);
1946}
1947EXPORT_SYMBOL(ocelot_get_ethtool_stats);
1948
1949int ocelot_get_sset_count(struct ocelot *ocelot, int port, int sset)
1950{
1951        if (sset != ETH_SS_STATS)
1952                return -EOPNOTSUPP;
1953
1954        return ocelot->num_stats;
1955}
1956EXPORT_SYMBOL(ocelot_get_sset_count);
1957
1958static int ocelot_prepare_stats_regions(struct ocelot *ocelot)
1959{
1960        struct ocelot_stats_region *region = NULL;
1961        unsigned int last;
1962        int i;
1963
1964        INIT_LIST_HEAD(&ocelot->stats_regions);
1965
1966        for (i = 0; i < ocelot->num_stats; i++) {
1967                if (region && ocelot->stats_layout[i].offset == last + 1) {
1968                        region->count++;
1969                } else {
1970                        region = devm_kzalloc(ocelot->dev, sizeof(*region),
1971                                              GFP_KERNEL);
1972                        if (!region)
1973                                return -ENOMEM;
1974
1975                        region->offset = ocelot->stats_layout[i].offset;
1976                        region->count = 1;
1977                        list_add_tail(&region->node, &ocelot->stats_regions);
1978                }
1979
1980                last = ocelot->stats_layout[i].offset;
1981        }
1982
1983        list_for_each_entry(region, &ocelot->stats_regions, node) {
1984                region->buf = devm_kcalloc(ocelot->dev, region->count,
1985                                           sizeof(*region->buf), GFP_KERNEL);
1986                if (!region->buf)
1987                        return -ENOMEM;
1988        }
1989
1990        return 0;
1991}
1992
1993int ocelot_get_ts_info(struct ocelot *ocelot, int port,
1994                       struct ethtool_ts_info *info)
1995{
1996        info->phc_index = ocelot->ptp_clock ?
1997                          ptp_clock_index(ocelot->ptp_clock) : -1;
1998        if (info->phc_index == -1) {
1999                info->so_timestamping |= SOF_TIMESTAMPING_TX_SOFTWARE |
2000                                         SOF_TIMESTAMPING_RX_SOFTWARE |
2001                                         SOF_TIMESTAMPING_SOFTWARE;
2002                return 0;
2003        }
2004        info->so_timestamping |= SOF_TIMESTAMPING_TX_SOFTWARE |
2005                                 SOF_TIMESTAMPING_RX_SOFTWARE |
2006                                 SOF_TIMESTAMPING_SOFTWARE |
2007                                 SOF_TIMESTAMPING_TX_HARDWARE |
2008                                 SOF_TIMESTAMPING_RX_HARDWARE |
2009                                 SOF_TIMESTAMPING_RAW_HARDWARE;
2010        info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON) |
2011                         BIT(HWTSTAMP_TX_ONESTEP_SYNC);
2012        info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) |
2013                           BIT(HWTSTAMP_FILTER_PTP_V2_EVENT) |
2014                           BIT(HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
2015                           BIT(HWTSTAMP_FILTER_PTP_V2_L4_EVENT);
2016
2017        return 0;
2018}
2019EXPORT_SYMBOL(ocelot_get_ts_info);
2020
2021static u32 ocelot_get_bond_mask(struct ocelot *ocelot, struct net_device *bond)
2022{
2023        u32 mask = 0;
2024        int port;
2025
2026        lockdep_assert_held(&ocelot->fwd_domain_lock);
2027
2028        for (port = 0; port < ocelot->num_phys_ports; port++) {
2029                struct ocelot_port *ocelot_port = ocelot->ports[port];
2030
2031                if (!ocelot_port)
2032                        continue;
2033
2034                if (ocelot_port->bond == bond)
2035                        mask |= BIT(port);
2036        }
2037
2038        return mask;
2039}
2040
2041/* The logical port number of a LAG is equal to the lowest numbered physical
2042 * port ID present in that LAG. It may change if that port ever leaves the LAG.
2043 */
2044static int ocelot_bond_get_id(struct ocelot *ocelot, struct net_device *bond)
2045{
2046        int bond_mask = ocelot_get_bond_mask(ocelot, bond);
2047
2048        if (!bond_mask)
2049                return -ENOENT;
2050
2051        return __ffs(bond_mask);
2052}
2053
2054u32 ocelot_get_bridge_fwd_mask(struct ocelot *ocelot, int src_port)
2055{
2056        struct ocelot_port *ocelot_port = ocelot->ports[src_port];
2057        const struct net_device *bridge;
2058        u32 mask = 0;
2059        int port;
2060
2061        if (!ocelot_port || ocelot_port->stp_state != BR_STATE_FORWARDING)
2062                return 0;
2063
2064        bridge = ocelot_port->bridge;
2065        if (!bridge)
2066                return 0;
2067
2068        for (port = 0; port < ocelot->num_phys_ports; port++) {
2069                ocelot_port = ocelot->ports[port];
2070
2071                if (!ocelot_port)
2072                        continue;
2073
2074                if (ocelot_port->stp_state == BR_STATE_FORWARDING &&
2075                    ocelot_port->bridge == bridge)
2076                        mask |= BIT(port);
2077        }
2078
2079        return mask;
2080}
2081EXPORT_SYMBOL_GPL(ocelot_get_bridge_fwd_mask);
2082
2083u32 ocelot_get_dsa_8021q_cpu_mask(struct ocelot *ocelot)
2084{
2085        u32 mask = 0;
2086        int port;
2087
2088        for (port = 0; port < ocelot->num_phys_ports; port++) {
2089                struct ocelot_port *ocelot_port = ocelot->ports[port];
2090
2091                if (!ocelot_port)
2092                        continue;
2093
2094                if (ocelot_port->is_dsa_8021q_cpu)
2095                        mask |= BIT(port);
2096        }
2097
2098        return mask;
2099}
2100EXPORT_SYMBOL_GPL(ocelot_get_dsa_8021q_cpu_mask);
2101
2102void ocelot_apply_bridge_fwd_mask(struct ocelot *ocelot, bool joining)
2103{
2104        unsigned long cpu_fwd_mask;
2105        int port;
2106
2107        lockdep_assert_held(&ocelot->fwd_domain_lock);
2108
2109        /* If cut-through forwarding is supported, update the masks before a
2110         * port joins the forwarding domain, to avoid potential underruns if it
2111         * has the highest speed from the new domain.
2112         */
2113        if (joining && ocelot->ops->cut_through_fwd)
2114                ocelot->ops->cut_through_fwd(ocelot);
2115
2116        /* If a DSA tag_8021q CPU exists, it needs to be included in the
2117         * regular forwarding path of the front ports regardless of whether
2118         * those are bridged or standalone.
2119         * If DSA tag_8021q is not used, this returns 0, which is fine because
2120         * the hardware-based CPU port module can be a destination for packets
2121         * even if it isn't part of PGID_SRC.
2122         */
2123        cpu_fwd_mask = ocelot_get_dsa_8021q_cpu_mask(ocelot);
2124
2125        /* Apply FWD mask. The loop is needed to add/remove the current port as
2126         * a source for the other ports.
2127         */
2128        for (port = 0; port < ocelot->num_phys_ports; port++) {
2129                struct ocelot_port *ocelot_port = ocelot->ports[port];
2130                unsigned long mask;
2131
2132                if (!ocelot_port) {
2133                        /* Unused ports can't send anywhere */
2134                        mask = 0;
2135                } else if (ocelot_port->is_dsa_8021q_cpu) {
2136                        /* The DSA tag_8021q CPU ports need to be able to
2137                         * forward packets to all other ports except for
2138                         * themselves
2139                         */
2140                        mask = GENMASK(ocelot->num_phys_ports - 1, 0);
2141                        mask &= ~cpu_fwd_mask;
2142                } else if (ocelot_port->bridge) {
2143                        struct net_device *bond = ocelot_port->bond;
2144
2145                        mask = ocelot_get_bridge_fwd_mask(ocelot, port);
2146                        mask |= cpu_fwd_mask;
2147                        mask &= ~BIT(port);
2148                        if (bond)
2149                                mask &= ~ocelot_get_bond_mask(ocelot, bond);
2150                } else {
2151                        /* Standalone ports forward only to DSA tag_8021q CPU
2152                         * ports (if those exist), or to the hardware CPU port
2153                         * module otherwise.
2154                         */
2155                        mask = cpu_fwd_mask;
2156                }
2157
2158                ocelot_write_rix(ocelot, mask, ANA_PGID_PGID, PGID_SRC + port);
2159        }
2160
2161        /* If cut-through forwarding is supported and a port is leaving, there
2162         * is a chance that cut-through was disabled on the other ports due to
2163         * the port which is leaving (it has a higher link speed). We need to
2164         * update the cut-through masks of the remaining ports no earlier than
2165         * after the port has left, to prevent underruns from happening between
2166         * the cut-through update and the forwarding domain update.
2167         */
2168        if (!joining && ocelot->ops->cut_through_fwd)
2169                ocelot->ops->cut_through_fwd(ocelot);
2170}
2171EXPORT_SYMBOL(ocelot_apply_bridge_fwd_mask);
2172
2173void ocelot_port_set_dsa_8021q_cpu(struct ocelot *ocelot, int port)
2174{
2175        u16 vid;
2176
2177        ocelot->ports[port]->is_dsa_8021q_cpu = true;
2178
2179        for (vid = OCELOT_RSV_VLAN_RANGE_START; vid < VLAN_N_VID; vid++)
2180                ocelot_vlan_member_add(ocelot, port, vid, true);
2181}
2182EXPORT_SYMBOL_GPL(ocelot_port_set_dsa_8021q_cpu);
2183
2184void ocelot_port_unset_dsa_8021q_cpu(struct ocelot *ocelot, int port)
2185{
2186        u16 vid;
2187
2188        ocelot->ports[port]->is_dsa_8021q_cpu = false;
2189
2190        for (vid = OCELOT_RSV_VLAN_RANGE_START; vid < VLAN_N_VID; vid++)
2191                ocelot_vlan_member_del(ocelot, port, vid);
2192}
2193EXPORT_SYMBOL_GPL(ocelot_port_unset_dsa_8021q_cpu);
2194
2195void ocelot_bridge_stp_state_set(struct ocelot *ocelot, int port, u8 state)
2196{
2197        struct ocelot_port *ocelot_port = ocelot->ports[port];
2198        u32 learn_ena = 0;
2199
2200        mutex_lock(&ocelot->fwd_domain_lock);
2201
2202        ocelot_port->stp_state = state;
2203
2204        if ((state == BR_STATE_LEARNING || state == BR_STATE_FORWARDING) &&
2205            ocelot_port->learn_ena)
2206                learn_ena = ANA_PORT_PORT_CFG_LEARN_ENA;
2207
2208        ocelot_rmw_gix(ocelot, learn_ena, ANA_PORT_PORT_CFG_LEARN_ENA,
2209                       ANA_PORT_PORT_CFG, port);
2210
2211        ocelot_apply_bridge_fwd_mask(ocelot, state == BR_STATE_FORWARDING);
2212
2213        mutex_unlock(&ocelot->fwd_domain_lock);
2214}
2215EXPORT_SYMBOL(ocelot_bridge_stp_state_set);
2216
2217void ocelot_set_ageing_time(struct ocelot *ocelot, unsigned int msecs)
2218{
2219        unsigned int age_period = ANA_AUTOAGE_AGE_PERIOD(msecs / 2000);
2220
2221        /* Setting AGE_PERIOD to zero effectively disables automatic aging,
2222         * which is clearly not what our intention is. So avoid that.
2223         */
2224        if (!age_period)
2225                age_period = 1;
2226
2227        ocelot_rmw(ocelot, age_period, ANA_AUTOAGE_AGE_PERIOD_M, ANA_AUTOAGE);
2228}
2229EXPORT_SYMBOL(ocelot_set_ageing_time);
2230
2231static struct ocelot_multicast *ocelot_multicast_get(struct ocelot *ocelot,
2232                                                     const unsigned char *addr,
2233                                                     u16 vid)
2234{
2235        struct ocelot_multicast *mc;
2236
2237        list_for_each_entry(mc, &ocelot->multicast, list) {
2238                if (ether_addr_equal(mc->addr, addr) && mc->vid == vid)
2239                        return mc;
2240        }
2241
2242        return NULL;
2243}
2244
2245static enum macaccess_entry_type ocelot_classify_mdb(const unsigned char *addr)
2246{
2247        if (addr[0] == 0x01 && addr[1] == 0x00 && addr[2] == 0x5e)
2248                return ENTRYTYPE_MACv4;
2249        if (addr[0] == 0x33 && addr[1] == 0x33)
2250                return ENTRYTYPE_MACv6;
2251        return ENTRYTYPE_LOCKED;
2252}
2253
2254static struct ocelot_pgid *ocelot_pgid_alloc(struct ocelot *ocelot, int index,
2255                                             unsigned long ports)
2256{
2257        struct ocelot_pgid *pgid;
2258
2259        pgid = kzalloc(sizeof(*pgid), GFP_KERNEL);
2260        if (!pgid)
2261                return ERR_PTR(-ENOMEM);
2262
2263        pgid->ports = ports;
2264        pgid->index = index;
2265        refcount_set(&pgid->refcount, 1);
2266        list_add_tail(&pgid->list, &ocelot->pgids);
2267
2268        return pgid;
2269}
2270
2271static void ocelot_pgid_free(struct ocelot *ocelot, struct ocelot_pgid *pgid)
2272{
2273        if (!refcount_dec_and_test(&pgid->refcount))
2274                return;
2275
2276        list_del(&pgid->list);
2277        kfree(pgid);
2278}
2279
2280static struct ocelot_pgid *ocelot_mdb_get_pgid(struct ocelot *ocelot,
2281                                               const struct ocelot_multicast *mc)
2282{
2283        struct ocelot_pgid *pgid;
2284        int index;
2285
2286        /* According to VSC7514 datasheet 3.9.1.5 IPv4 Multicast Entries and
2287         * 3.9.1.6 IPv6 Multicast Entries, "Instead of a lookup in the
2288         * destination mask table (PGID), the destination set is programmed as
2289         * part of the entry MAC address.", and the DEST_IDX is set to 0.
2290         */
2291        if (mc->entry_type == ENTRYTYPE_MACv4 ||
2292            mc->entry_type == ENTRYTYPE_MACv6)
2293                return ocelot_pgid_alloc(ocelot, 0, mc->ports);
2294
2295        list_for_each_entry(pgid, &ocelot->pgids, list) {
2296                /* When searching for a nonreserved multicast PGID, ignore the
2297                 * dummy PGID of zero that we have for MACv4/MACv6 entries
2298                 */
2299                if (pgid->index && pgid->ports == mc->ports) {
2300                        refcount_inc(&pgid->refcount);
2301                        return pgid;
2302                }
2303        }
2304
2305        /* Search for a free index in the nonreserved multicast PGID area */
2306        for_each_nonreserved_multicast_dest_pgid(ocelot, index) {
2307                bool used = false;
2308
2309                list_for_each_entry(pgid, &ocelot->pgids, list) {
2310                        if (pgid->index == index) {
2311                                used = true;
2312                                break;
2313                        }
2314                }
2315
2316                if (!used)
2317                        return ocelot_pgid_alloc(ocelot, index, mc->ports);
2318        }
2319
2320        return ERR_PTR(-ENOSPC);
2321}
2322
2323static void ocelot_encode_ports_to_mdb(unsigned char *addr,
2324                                       struct ocelot_multicast *mc)
2325{
2326        ether_addr_copy(addr, mc->addr);
2327
2328        if (mc->entry_type == ENTRYTYPE_MACv4) {
2329                addr[0] = 0;
2330                addr[1] = mc->ports >> 8;
2331                addr[2] = mc->ports & 0xff;
2332        } else if (mc->entry_type == ENTRYTYPE_MACv6) {
2333                addr[0] = mc->ports >> 8;
2334                addr[1] = mc->ports & 0xff;
2335        }
2336}
2337
2338int ocelot_port_mdb_add(struct ocelot *ocelot, int port,
2339                        const struct switchdev_obj_port_mdb *mdb,
2340                        const struct net_device *bridge)
2341{
2342        unsigned char addr[ETH_ALEN];
2343        struct ocelot_multicast *mc;
2344        struct ocelot_pgid *pgid;
2345        u16 vid = mdb->vid;
2346
2347        if (port == ocelot->npi)
2348                port = ocelot->num_phys_ports;
2349
2350        if (!vid)
2351                vid = ocelot_vlan_unaware_pvid(ocelot, bridge);
2352
2353        mc = ocelot_multicast_get(ocelot, mdb->addr, vid);
2354        if (!mc) {
2355                /* New entry */
2356                mc = devm_kzalloc(ocelot->dev, sizeof(*mc), GFP_KERNEL);
2357                if (!mc)
2358                        return -ENOMEM;
2359
2360                mc->entry_type = ocelot_classify_mdb(mdb->addr);
2361                ether_addr_copy(mc->addr, mdb->addr);
2362                mc->vid = vid;
2363
2364                list_add_tail(&mc->list, &ocelot->multicast);
2365        } else {
2366                /* Existing entry. Clean up the current port mask from
2367                 * hardware now, because we'll be modifying it.
2368                 */
2369                ocelot_pgid_free(ocelot, mc->pgid);
2370                ocelot_encode_ports_to_mdb(addr, mc);
2371                ocelot_mact_forget(ocelot, addr, vid);
2372        }
2373
2374        mc->ports |= BIT(port);
2375
2376        pgid = ocelot_mdb_get_pgid(ocelot, mc);
2377        if (IS_ERR(pgid)) {
2378                dev_err(ocelot->dev,
2379                        "Cannot allocate PGID for mdb %pM vid %d\n",
2380                        mc->addr, mc->vid);
2381                devm_kfree(ocelot->dev, mc);
2382                return PTR_ERR(pgid);
2383        }
2384        mc->pgid = pgid;
2385
2386        ocelot_encode_ports_to_mdb(addr, mc);
2387
2388        if (mc->entry_type != ENTRYTYPE_MACv4 &&
2389            mc->entry_type != ENTRYTYPE_MACv6)
2390                ocelot_write_rix(ocelot, pgid->ports, ANA_PGID_PGID,
2391                                 pgid->index);
2392
2393        return ocelot_mact_learn(ocelot, pgid->index, addr, vid,
2394                                 mc->entry_type);
2395}
2396EXPORT_SYMBOL(ocelot_port_mdb_add);
2397
2398int ocelot_port_mdb_del(struct ocelot *ocelot, int port,
2399                        const struct switchdev_obj_port_mdb *mdb,
2400                        const struct net_device *bridge)
2401{
2402        unsigned char addr[ETH_ALEN];
2403        struct ocelot_multicast *mc;
2404        struct ocelot_pgid *pgid;
2405        u16 vid = mdb->vid;
2406
2407        if (port == ocelot->npi)
2408                port = ocelot->num_phys_ports;
2409
2410        if (!vid)
2411                vid = ocelot_vlan_unaware_pvid(ocelot, bridge);
2412
2413        mc = ocelot_multicast_get(ocelot, mdb->addr, vid);
2414        if (!mc)
2415                return -ENOENT;
2416
2417        ocelot_encode_ports_to_mdb(addr, mc);
2418        ocelot_mact_forget(ocelot, addr, vid);
2419
2420        ocelot_pgid_free(ocelot, mc->pgid);
2421        mc->ports &= ~BIT(port);
2422        if (!mc->ports) {
2423                list_del(&mc->list);
2424                devm_kfree(ocelot->dev, mc);
2425                return 0;
2426        }
2427
2428        /* We have a PGID with fewer ports now */
2429        pgid = ocelot_mdb_get_pgid(ocelot, mc);
2430        if (IS_ERR(pgid))
2431                return PTR_ERR(pgid);
2432        mc->pgid = pgid;
2433
2434        ocelot_encode_ports_to_mdb(addr, mc);
2435
2436        if (mc->entry_type != ENTRYTYPE_MACv4 &&
2437            mc->entry_type != ENTRYTYPE_MACv6)
2438                ocelot_write_rix(ocelot, pgid->ports, ANA_PGID_PGID,
2439                                 pgid->index);
2440
2441        return ocelot_mact_learn(ocelot, pgid->index, addr, vid,
2442                                 mc->entry_type);
2443}
2444EXPORT_SYMBOL(ocelot_port_mdb_del);
2445
2446int ocelot_port_bridge_join(struct ocelot *ocelot, int port,
2447                            struct net_device *bridge, int bridge_num,
2448                            struct netlink_ext_ack *extack)
2449{
2450        struct ocelot_port *ocelot_port = ocelot->ports[port];
2451        int err;
2452
2453        err = ocelot_single_vlan_aware_bridge(ocelot, extack);
2454        if (err)
2455                return err;
2456
2457        mutex_lock(&ocelot->fwd_domain_lock);
2458
2459        ocelot_port->bridge = bridge;
2460        ocelot_port->bridge_num = bridge_num;
2461
2462        ocelot_apply_bridge_fwd_mask(ocelot, true);
2463
2464        mutex_unlock(&ocelot->fwd_domain_lock);
2465
2466        if (br_vlan_enabled(bridge))
2467                return 0;
2468
2469        return ocelot_add_vlan_unaware_pvid(ocelot, port, bridge);
2470}
2471EXPORT_SYMBOL(ocelot_port_bridge_join);
2472
2473void ocelot_port_bridge_leave(struct ocelot *ocelot, int port,
2474                              struct net_device *bridge)
2475{
2476        struct ocelot_port *ocelot_port = ocelot->ports[port];
2477
2478        mutex_lock(&ocelot->fwd_domain_lock);
2479
2480        if (!br_vlan_enabled(bridge))
2481                ocelot_del_vlan_unaware_pvid(ocelot, port, bridge);
2482
2483        ocelot_port->bridge = NULL;
2484        ocelot_port->bridge_num = -1;
2485
2486        ocelot_port_set_pvid(ocelot, port, NULL);
2487        ocelot_port_manage_port_tag(ocelot, port);
2488        ocelot_apply_bridge_fwd_mask(ocelot, false);
2489
2490        mutex_unlock(&ocelot->fwd_domain_lock);
2491}
2492EXPORT_SYMBOL(ocelot_port_bridge_leave);
2493
2494static void ocelot_set_aggr_pgids(struct ocelot *ocelot)
2495{
2496        unsigned long visited = GENMASK(ocelot->num_phys_ports - 1, 0);
2497        int i, port, lag;
2498
2499        /* Reset destination and aggregation PGIDS */
2500        for_each_unicast_dest_pgid(ocelot, port)
2501                ocelot_write_rix(ocelot, BIT(port), ANA_PGID_PGID, port);
2502
2503        for_each_aggr_pgid(ocelot, i)
2504                ocelot_write_rix(ocelot, GENMASK(ocelot->num_phys_ports - 1, 0),
2505                                 ANA_PGID_PGID, i);
2506
2507        /* The visited ports bitmask holds the list of ports offloading any
2508         * bonding interface. Initially we mark all these ports as unvisited,
2509         * then every time we visit a port in this bitmask, we know that it is
2510         * the lowest numbered port, i.e. the one whose logical ID == physical
2511         * port ID == LAG ID. So we mark as visited all further ports in the
2512         * bitmask that are offloading the same bonding interface. This way,
2513         * we set up the aggregation PGIDs only once per bonding interface.
2514         */
2515        for (port = 0; port < ocelot->num_phys_ports; port++) {
2516                struct ocelot_port *ocelot_port = ocelot->ports[port];
2517
2518                if (!ocelot_port || !ocelot_port->bond)
2519                        continue;
2520
2521                visited &= ~BIT(port);
2522        }
2523
2524        /* Now, set PGIDs for each active LAG */
2525        for (lag = 0; lag < ocelot->num_phys_ports; lag++) {
2526                struct net_device *bond = ocelot->ports[lag]->bond;
2527                int num_active_ports = 0;
2528                unsigned long bond_mask;
2529                u8 aggr_idx[16];
2530
2531                if (!bond || (visited & BIT(lag)))
2532                        continue;
2533
2534                bond_mask = ocelot_get_bond_mask(ocelot, bond);
2535
2536                for_each_set_bit(port, &bond_mask, ocelot->num_phys_ports) {
2537                        struct ocelot_port *ocelot_port = ocelot->ports[port];
2538
2539                        // Destination mask
2540                        ocelot_write_rix(ocelot, bond_mask,
2541                                         ANA_PGID_PGID, port);
2542
2543                        if (ocelot_port->lag_tx_active)
2544                                aggr_idx[num_active_ports++] = port;
2545                }
2546
2547                for_each_aggr_pgid(ocelot, i) {
2548                        u32 ac;
2549
2550                        ac = ocelot_read_rix(ocelot, ANA_PGID_PGID, i);
2551                        ac &= ~bond_mask;
2552                        /* Don't do division by zero if there was no active
2553                         * port. Just make all aggregation codes zero.
2554                         */
2555                        if (num_active_ports)
2556                                ac |= BIT(aggr_idx[i % num_active_ports]);
2557                        ocelot_write_rix(ocelot, ac, ANA_PGID_PGID, i);
2558                }
2559
2560                /* Mark all ports in the same LAG as visited to avoid applying
2561                 * the same config again.
2562                 */
2563                for (port = lag; port < ocelot->num_phys_ports; port++) {
2564                        struct ocelot_port *ocelot_port = ocelot->ports[port];
2565
2566                        if (!ocelot_port)
2567                                continue;
2568
2569                        if (ocelot_port->bond == bond)
2570                                visited |= BIT(port);
2571                }
2572        }
2573}
2574
2575/* When offloading a bonding interface, the switch ports configured under the
2576 * same bond must have the same logical port ID, equal to the physical port ID
2577 * of the lowest numbered physical port in that bond. Otherwise, in standalone/
2578 * bridged mode, each port has a logical port ID equal to its physical port ID.
2579 */
2580static void ocelot_setup_logical_port_ids(struct ocelot *ocelot)
2581{
2582        int port;
2583
2584        for (port = 0; port < ocelot->num_phys_ports; port++) {
2585                struct ocelot_port *ocelot_port = ocelot->ports[port];
2586                struct net_device *bond;
2587
2588                if (!ocelot_port)
2589                        continue;
2590
2591                bond = ocelot_port->bond;
2592                if (bond) {
2593                        int lag = ocelot_bond_get_id(ocelot, bond);
2594
2595                        ocelot_rmw_gix(ocelot,
2596                                       ANA_PORT_PORT_CFG_PORTID_VAL(lag),
2597                                       ANA_PORT_PORT_CFG_PORTID_VAL_M,
2598                                       ANA_PORT_PORT_CFG, port);
2599                } else {
2600                        ocelot_rmw_gix(ocelot,
2601                                       ANA_PORT_PORT_CFG_PORTID_VAL(port),
2602                                       ANA_PORT_PORT_CFG_PORTID_VAL_M,
2603                                       ANA_PORT_PORT_CFG, port);
2604                }
2605        }
2606}
2607
2608/* Documentation for PORTID_VAL says:
2609 *     Logical port number for front port. If port is not a member of a LLAG,
2610 *     then PORTID must be set to the physical port number.
2611 *     If port is a member of a LLAG, then PORTID must be set to the common
2612 *     PORTID_VAL used for all member ports of the LLAG.
2613 *     The value must not exceed the number of physical ports on the device.
2614 *
2615 * This means we have little choice but to migrate FDB entries pointing towards
2616 * a logical port when that changes.
2617 */
2618static void ocelot_migrate_lag_fdbs(struct ocelot *ocelot,
2619                                    struct net_device *bond,
2620                                    int lag)
2621{
2622        struct ocelot_lag_fdb *fdb;
2623        int err;
2624
2625        lockdep_assert_held(&ocelot->fwd_domain_lock);
2626
2627        list_for_each_entry(fdb, &ocelot->lag_fdbs, list) {
2628                if (fdb->bond != bond)
2629                        continue;
2630
2631                err = ocelot_mact_forget(ocelot, fdb->addr, fdb->vid);
2632                if (err) {
2633                        dev_err(ocelot->dev,
2634                                "failed to delete LAG %s FDB %pM vid %d: %pe\n",
2635                                bond->name, fdb->addr, fdb->vid, ERR_PTR(err));
2636                }
2637
2638                err = ocelot_mact_learn(ocelot, lag, fdb->addr, fdb->vid,
2639                                        ENTRYTYPE_LOCKED);
2640                if (err) {
2641                        dev_err(ocelot->dev,
2642                                "failed to migrate LAG %s FDB %pM vid %d: %pe\n",
2643                                bond->name, fdb->addr, fdb->vid, ERR_PTR(err));
2644                }
2645        }
2646}
2647
2648int ocelot_port_lag_join(struct ocelot *ocelot, int port,
2649                         struct net_device *bond,
2650                         struct netdev_lag_upper_info *info)
2651{
2652        if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH)
2653                return -EOPNOTSUPP;
2654
2655        mutex_lock(&ocelot->fwd_domain_lock);
2656
2657        ocelot->ports[port]->bond = bond;
2658
2659        ocelot_setup_logical_port_ids(ocelot);
2660        ocelot_apply_bridge_fwd_mask(ocelot, true);
2661        ocelot_set_aggr_pgids(ocelot);
2662
2663        mutex_unlock(&ocelot->fwd_domain_lock);
2664
2665        return 0;
2666}
2667EXPORT_SYMBOL(ocelot_port_lag_join);
2668
2669void ocelot_port_lag_leave(struct ocelot *ocelot, int port,
2670                           struct net_device *bond)
2671{
2672        int old_lag_id, new_lag_id;
2673
2674        mutex_lock(&ocelot->fwd_domain_lock);
2675
2676        old_lag_id = ocelot_bond_get_id(ocelot, bond);
2677
2678        ocelot->ports[port]->bond = NULL;
2679
2680        ocelot_setup_logical_port_ids(ocelot);
2681        ocelot_apply_bridge_fwd_mask(ocelot, false);
2682        ocelot_set_aggr_pgids(ocelot);
2683
2684        new_lag_id = ocelot_bond_get_id(ocelot, bond);
2685
2686        if (new_lag_id >= 0 && old_lag_id != new_lag_id)
2687                ocelot_migrate_lag_fdbs(ocelot, bond, new_lag_id);
2688
2689        mutex_unlock(&ocelot->fwd_domain_lock);
2690}
2691EXPORT_SYMBOL(ocelot_port_lag_leave);
2692
2693void ocelot_port_lag_change(struct ocelot *ocelot, int port, bool lag_tx_active)
2694{
2695        struct ocelot_port *ocelot_port = ocelot->ports[port];
2696
2697        mutex_lock(&ocelot->fwd_domain_lock);
2698
2699        ocelot_port->lag_tx_active = lag_tx_active;
2700
2701        /* Rebalance the LAGs */
2702        ocelot_set_aggr_pgids(ocelot);
2703
2704        mutex_unlock(&ocelot->fwd_domain_lock);
2705}
2706EXPORT_SYMBOL(ocelot_port_lag_change);
2707
2708int ocelot_lag_fdb_add(struct ocelot *ocelot, struct net_device *bond,
2709                       const unsigned char *addr, u16 vid,
2710                       const struct net_device *bridge)
2711{
2712        struct ocelot_lag_fdb *fdb;
2713        int lag, err;
2714
2715        fdb = kzalloc(sizeof(*fdb), GFP_KERNEL);
2716        if (!fdb)
2717                return -ENOMEM;
2718
2719        mutex_lock(&ocelot->fwd_domain_lock);
2720
2721        if (!vid)
2722                vid = ocelot_vlan_unaware_pvid(ocelot, bridge);
2723
2724        ether_addr_copy(fdb->addr, addr);
2725        fdb->vid = vid;
2726        fdb->bond = bond;
2727
2728        lag = ocelot_bond_get_id(ocelot, bond);
2729
2730        err = ocelot_mact_learn(ocelot, lag, addr, vid, ENTRYTYPE_LOCKED);
2731        if (err) {
2732                mutex_unlock(&ocelot->fwd_domain_lock);
2733                kfree(fdb);
2734                return err;
2735        }
2736
2737        list_add_tail(&fdb->list, &ocelot->lag_fdbs);
2738        mutex_unlock(&ocelot->fwd_domain_lock);
2739
2740        return 0;
2741}
2742EXPORT_SYMBOL_GPL(ocelot_lag_fdb_add);
2743
2744int ocelot_lag_fdb_del(struct ocelot *ocelot, struct net_device *bond,
2745                       const unsigned char *addr, u16 vid,
2746                       const struct net_device *bridge)
2747{
2748        struct ocelot_lag_fdb *fdb, *tmp;
2749
2750        mutex_lock(&ocelot->fwd_domain_lock);
2751
2752        if (!vid)
2753                vid = ocelot_vlan_unaware_pvid(ocelot, bridge);
2754
2755        list_for_each_entry_safe(fdb, tmp, &ocelot->lag_fdbs, list) {
2756                if (!ether_addr_equal(fdb->addr, addr) || fdb->vid != vid ||
2757                    fdb->bond != bond)
2758                        continue;
2759
2760                ocelot_mact_forget(ocelot, addr, vid);
2761                list_del(&fdb->list);
2762                mutex_unlock(&ocelot->fwd_domain_lock);
2763                kfree(fdb);
2764
2765                return 0;
2766        }
2767
2768        mutex_unlock(&ocelot->fwd_domain_lock);
2769
2770        return -ENOENT;
2771}
2772EXPORT_SYMBOL_GPL(ocelot_lag_fdb_del);
2773
2774/* Configure the maximum SDU (L2 payload) on RX to the value specified in @sdu.
2775 * The length of VLAN tags is accounted for automatically via DEV_MAC_TAGS_CFG.
2776 * In the special case that it's the NPI port that we're configuring, the
2777 * length of the tag and optional prefix needs to be accounted for privately,
2778 * in order to be able to sustain communication at the requested @sdu.
2779 */
2780void ocelot_port_set_maxlen(struct ocelot *ocelot, int port, size_t sdu)
2781{
2782        struct ocelot_port *ocelot_port = ocelot->ports[port];
2783        int maxlen = sdu + ETH_HLEN + ETH_FCS_LEN;
2784        int pause_start, pause_stop;
2785        int atop, atop_tot;
2786
2787        if (port == ocelot->npi) {
2788                maxlen += OCELOT_TAG_LEN;
2789
2790                if (ocelot->npi_inj_prefix == OCELOT_TAG_PREFIX_SHORT)
2791                        maxlen += OCELOT_SHORT_PREFIX_LEN;
2792                else if (ocelot->npi_inj_prefix == OCELOT_TAG_PREFIX_LONG)
2793                        maxlen += OCELOT_LONG_PREFIX_LEN;
2794        }
2795
2796        ocelot_port_writel(ocelot_port, maxlen, DEV_MAC_MAXLEN_CFG);
2797
2798        /* Set Pause watermark hysteresis */
2799        pause_start = 6 * maxlen / OCELOT_BUFFER_CELL_SZ;
2800        pause_stop = 4 * maxlen / OCELOT_BUFFER_CELL_SZ;
2801        ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_START,
2802                            pause_start);
2803        ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_STOP,
2804                            pause_stop);
2805
2806        /* Tail dropping watermarks */
2807        atop_tot = (ocelot->packet_buffer_size - 9 * maxlen) /
2808                   OCELOT_BUFFER_CELL_SZ;
2809        atop = (9 * maxlen) / OCELOT_BUFFER_CELL_SZ;
2810        ocelot_write_rix(ocelot, ocelot->ops->wm_enc(atop), SYS_ATOP, port);
2811        ocelot_write(ocelot, ocelot->ops->wm_enc(atop_tot), SYS_ATOP_TOT_CFG);
2812}
2813EXPORT_SYMBOL(ocelot_port_set_maxlen);
2814
2815int ocelot_get_max_mtu(struct ocelot *ocelot, int port)
2816{
2817        int max_mtu = 65535 - ETH_HLEN - ETH_FCS_LEN;
2818
2819        if (port == ocelot->npi) {
2820                max_mtu -= OCELOT_TAG_LEN;
2821
2822                if (ocelot->npi_inj_prefix == OCELOT_TAG_PREFIX_SHORT)
2823                        max_mtu -= OCELOT_SHORT_PREFIX_LEN;
2824                else if (ocelot->npi_inj_prefix == OCELOT_TAG_PREFIX_LONG)
2825                        max_mtu -= OCELOT_LONG_PREFIX_LEN;
2826        }
2827
2828        return max_mtu;
2829}
2830EXPORT_SYMBOL(ocelot_get_max_mtu);
2831
2832static void ocelot_port_set_learning(struct ocelot *ocelot, int port,
2833                                     bool enabled)
2834{
2835        struct ocelot_port *ocelot_port = ocelot->ports[port];
2836        u32 val = 0;
2837
2838        if (enabled)
2839                val = ANA_PORT_PORT_CFG_LEARN_ENA;
2840
2841        ocelot_rmw_gix(ocelot, val, ANA_PORT_PORT_CFG_LEARN_ENA,
2842                       ANA_PORT_PORT_CFG, port);
2843
2844        ocelot_port->learn_ena = enabled;
2845}
2846
2847static void ocelot_port_set_ucast_flood(struct ocelot *ocelot, int port,
2848                                        bool enabled)
2849{
2850        u32 val = 0;
2851
2852        if (enabled)
2853                val = BIT(port);
2854
2855        ocelot_rmw_rix(ocelot, val, BIT(port), ANA_PGID_PGID, PGID_UC);
2856}
2857
2858static void ocelot_port_set_mcast_flood(struct ocelot *ocelot, int port,
2859                                        bool enabled)
2860{
2861        u32 val = 0;
2862
2863        if (enabled)
2864                val = BIT(port);
2865
2866        ocelot_rmw_rix(ocelot, val, BIT(port), ANA_PGID_PGID, PGID_MC);
2867        ocelot_rmw_rix(ocelot, val, BIT(port), ANA_PGID_PGID, PGID_MCIPV4);
2868        ocelot_rmw_rix(ocelot, val, BIT(port), ANA_PGID_PGID, PGID_MCIPV6);
2869}
2870
2871static void ocelot_port_set_bcast_flood(struct ocelot *ocelot, int port,
2872                                        bool enabled)
2873{
2874        u32 val = 0;
2875
2876        if (enabled)
2877                val = BIT(port);
2878
2879        ocelot_rmw_rix(ocelot, val, BIT(port), ANA_PGID_PGID, PGID_BC);
2880}
2881
2882int ocelot_port_pre_bridge_flags(struct ocelot *ocelot, int port,
2883                                 struct switchdev_brport_flags flags)
2884{
2885        if (flags.mask & ~(BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD |
2886                           BR_BCAST_FLOOD))
2887                return -EINVAL;
2888
2889        return 0;
2890}
2891EXPORT_SYMBOL(ocelot_port_pre_bridge_flags);
2892
2893void ocelot_port_bridge_flags(struct ocelot *ocelot, int port,
2894                              struct switchdev_brport_flags flags)
2895{
2896        if (port == ocelot->npi)
2897                port = ocelot->num_phys_ports;
2898
2899        if (flags.mask & BR_LEARNING)
2900                ocelot_port_set_learning(ocelot, port,
2901                                         !!(flags.val & BR_LEARNING));
2902
2903        if (flags.mask & BR_FLOOD)
2904                ocelot_port_set_ucast_flood(ocelot, port,
2905                                            !!(flags.val & BR_FLOOD));
2906
2907        if (flags.mask & BR_MCAST_FLOOD)
2908                ocelot_port_set_mcast_flood(ocelot, port,
2909                                            !!(flags.val & BR_MCAST_FLOOD));
2910
2911        if (flags.mask & BR_BCAST_FLOOD)
2912                ocelot_port_set_bcast_flood(ocelot, port,
2913                                            !!(flags.val & BR_BCAST_FLOOD));
2914}
2915EXPORT_SYMBOL(ocelot_port_bridge_flags);
2916
2917int ocelot_port_get_default_prio(struct ocelot *ocelot, int port)
2918{
2919        int val = ocelot_read_gix(ocelot, ANA_PORT_QOS_CFG, port);
2920
2921        return ANA_PORT_QOS_CFG_QOS_DEFAULT_VAL_X(val);
2922}
2923EXPORT_SYMBOL_GPL(ocelot_port_get_default_prio);
2924
2925int ocelot_port_set_default_prio(struct ocelot *ocelot, int port, u8 prio)
2926{
2927        if (prio >= OCELOT_NUM_TC)
2928                return -ERANGE;
2929
2930        ocelot_rmw_gix(ocelot,
2931                       ANA_PORT_QOS_CFG_QOS_DEFAULT_VAL(prio),
2932                       ANA_PORT_QOS_CFG_QOS_DEFAULT_VAL_M,
2933                       ANA_PORT_QOS_CFG,
2934                       port);
2935
2936        return 0;
2937}
2938EXPORT_SYMBOL_GPL(ocelot_port_set_default_prio);
2939
2940int ocelot_port_get_dscp_prio(struct ocelot *ocelot, int port, u8 dscp)
2941{
2942        int qos_cfg = ocelot_read_gix(ocelot, ANA_PORT_QOS_CFG, port);
2943        int dscp_cfg = ocelot_read_rix(ocelot, ANA_DSCP_CFG, dscp);
2944
2945        /* Return error if DSCP prioritization isn't enabled */
2946        if (!(qos_cfg & ANA_PORT_QOS_CFG_QOS_DSCP_ENA))
2947                return -EOPNOTSUPP;
2948
2949        if (qos_cfg & ANA_PORT_QOS_CFG_DSCP_TRANSLATE_ENA) {
2950                dscp = ANA_DSCP_CFG_DSCP_TRANSLATE_VAL_X(dscp_cfg);
2951                /* Re-read ANA_DSCP_CFG for the translated DSCP */
2952                dscp_cfg = ocelot_read_rix(ocelot, ANA_DSCP_CFG, dscp);
2953        }
2954
2955        /* If the DSCP value is not trusted, the QoS classification falls back
2956         * to VLAN PCP or port-based default.
2957         */
2958        if (!(dscp_cfg & ANA_DSCP_CFG_DSCP_TRUST_ENA))
2959                return -EOPNOTSUPP;
2960
2961        return ANA_DSCP_CFG_QOS_DSCP_VAL_X(dscp_cfg);
2962}
2963EXPORT_SYMBOL_GPL(ocelot_port_get_dscp_prio);
2964
2965int ocelot_port_add_dscp_prio(struct ocelot *ocelot, int port, u8 dscp, u8 prio)
2966{
2967        int mask, val;
2968
2969        if (prio >= OCELOT_NUM_TC)
2970                return -ERANGE;
2971
2972        /* There is at least one app table priority (this one), so we need to
2973         * make sure DSCP prioritization is enabled on the port.
2974         * Also make sure DSCP translation is disabled
2975         * (dcbnl doesn't support it).
2976         */
2977        mask = ANA_PORT_QOS_CFG_QOS_DSCP_ENA |
2978               ANA_PORT_QOS_CFG_DSCP_TRANSLATE_ENA;
2979
2980        ocelot_rmw_gix(ocelot, ANA_PORT_QOS_CFG_QOS_DSCP_ENA, mask,
2981                       ANA_PORT_QOS_CFG, port);
2982
2983        /* Trust this DSCP value and map it to the given QoS class */
2984        val = ANA_DSCP_CFG_DSCP_TRUST_ENA | ANA_DSCP_CFG_QOS_DSCP_VAL(prio);
2985
2986        ocelot_write_rix(ocelot, val, ANA_DSCP_CFG, dscp);
2987
2988        return 0;
2989}
2990EXPORT_SYMBOL_GPL(ocelot_port_add_dscp_prio);
2991
2992int ocelot_port_del_dscp_prio(struct ocelot *ocelot, int port, u8 dscp, u8 prio)
2993{
2994        int dscp_cfg = ocelot_read_rix(ocelot, ANA_DSCP_CFG, dscp);
2995        int mask, i;
2996
2997        /* During a "dcb app replace" command, the new app table entry will be
2998         * added first, then the old one will be deleted. But the hardware only
2999         * supports one QoS class per DSCP value (duh), so if we blindly delete
3000         * the app table entry for this DSCP value, we end up deleting the
3001         * entry with the new priority. Avoid that by checking whether user
3002         * space wants to delete the priority which is currently configured, or
3003         * something else which is no longer current.
3004         */
3005        if (ANA_DSCP_CFG_QOS_DSCP_VAL_X(dscp_cfg) != prio)
3006                return 0;
3007
3008        /* Untrust this DSCP value */
3009        ocelot_write_rix(ocelot, 0, ANA_DSCP_CFG, dscp);
3010
3011        for (i = 0; i < 64; i++) {
3012                int dscp_cfg = ocelot_read_rix(ocelot, ANA_DSCP_CFG, i);
3013
3014                /* There are still app table entries on the port, so we need to
3015                 * keep DSCP enabled, nothing to do.
3016                 */
3017                if (dscp_cfg & ANA_DSCP_CFG_DSCP_TRUST_ENA)
3018                        return 0;
3019        }
3020
3021        /* Disable DSCP QoS classification if there isn't any trusted
3022         * DSCP value left.
3023         */
3024        mask = ANA_PORT_QOS_CFG_QOS_DSCP_ENA |
3025               ANA_PORT_QOS_CFG_DSCP_TRANSLATE_ENA;
3026
3027        ocelot_rmw_gix(ocelot, 0, mask, ANA_PORT_QOS_CFG, port);
3028
3029        return 0;
3030}
3031EXPORT_SYMBOL_GPL(ocelot_port_del_dscp_prio);
3032
3033struct ocelot_mirror *ocelot_mirror_get(struct ocelot *ocelot, int to,
3034                                        struct netlink_ext_ack *extack)
3035{
3036        struct ocelot_mirror *m = ocelot->mirror;
3037
3038        if (m) {
3039                if (m->to != to) {
3040                        NL_SET_ERR_MSG_MOD(extack,
3041                                           "Mirroring already configured towards different egress port");
3042                        return ERR_PTR(-EBUSY);
3043                }
3044
3045                refcount_inc(&m->refcount);
3046                return m;
3047        }
3048
3049        m = kzalloc(sizeof(*m), GFP_KERNEL);
3050        if (!m)
3051                return ERR_PTR(-ENOMEM);
3052
3053        m->to = to;
3054        refcount_set(&m->refcount, 1);
3055        ocelot->mirror = m;
3056
3057        /* Program the mirror port to hardware */
3058        ocelot_write(ocelot, BIT(to), ANA_MIRRORPORTS);
3059
3060        return m;
3061}
3062
3063void ocelot_mirror_put(struct ocelot *ocelot)
3064{
3065        struct ocelot_mirror *m = ocelot->mirror;
3066
3067        if (!refcount_dec_and_test(&m->refcount))
3068                return;
3069
3070        ocelot_write(ocelot, 0, ANA_MIRRORPORTS);
3071        ocelot->mirror = NULL;
3072        kfree(m);
3073}
3074
3075int ocelot_port_mirror_add(struct ocelot *ocelot, int from, int to,
3076                           bool ingress, struct netlink_ext_ack *extack)
3077{
3078        struct ocelot_mirror *m = ocelot_mirror_get(ocelot, to, extack);
3079
3080        if (IS_ERR(m))
3081                return PTR_ERR(m);
3082
3083        if (ingress) {
3084                ocelot_rmw_gix(ocelot, ANA_PORT_PORT_CFG_SRC_MIRROR_ENA,
3085                               ANA_PORT_PORT_CFG_SRC_MIRROR_ENA,
3086                               ANA_PORT_PORT_CFG, from);
3087        } else {
3088                ocelot_rmw(ocelot, BIT(from), BIT(from),
3089                           ANA_EMIRRORPORTS);
3090        }
3091
3092        return 0;
3093}
3094EXPORT_SYMBOL_GPL(ocelot_port_mirror_add);
3095
3096void ocelot_port_mirror_del(struct ocelot *ocelot, int from, bool ingress)
3097{
3098        if (ingress) {
3099                ocelot_rmw_gix(ocelot, 0, ANA_PORT_PORT_CFG_SRC_MIRROR_ENA,
3100                               ANA_PORT_PORT_CFG, from);
3101        } else {
3102                ocelot_rmw(ocelot, 0, BIT(from), ANA_EMIRRORPORTS);
3103        }
3104
3105        ocelot_mirror_put(ocelot);
3106}
3107EXPORT_SYMBOL_GPL(ocelot_port_mirror_del);
3108
3109void ocelot_init_port(struct ocelot *ocelot, int port)
3110{
3111        struct ocelot_port *ocelot_port = ocelot->ports[port];
3112
3113        skb_queue_head_init(&ocelot_port->tx_skbs);
3114
3115        /* Basic L2 initialization */
3116
3117        /* Set MAC IFG Gaps
3118         * FDX: TX_IFG = 5, RX_IFG1 = RX_IFG2 = 0
3119         * !FDX: TX_IFG = 5, RX_IFG1 = RX_IFG2 = 5
3120         */
3121        ocelot_port_writel(ocelot_port, DEV_MAC_IFG_CFG_TX_IFG(5),
3122                           DEV_MAC_IFG_CFG);
3123
3124        /* Load seed (0) and set MAC HDX late collision  */
3125        ocelot_port_writel(ocelot_port, DEV_MAC_HDX_CFG_LATE_COL_POS(67) |
3126                           DEV_MAC_HDX_CFG_SEED_LOAD,
3127                           DEV_MAC_HDX_CFG);
3128        mdelay(1);
3129        ocelot_port_writel(ocelot_port, DEV_MAC_HDX_CFG_LATE_COL_POS(67),
3130                           DEV_MAC_HDX_CFG);
3131
3132        /* Set Max Length and maximum tags allowed */
3133        ocelot_port_set_maxlen(ocelot, port, ETH_DATA_LEN);
3134        ocelot_port_writel(ocelot_port, DEV_MAC_TAGS_CFG_TAG_ID(ETH_P_8021AD) |
3135                           DEV_MAC_TAGS_CFG_VLAN_AWR_ENA |
3136                           DEV_MAC_TAGS_CFG_VLAN_DBL_AWR_ENA |
3137                           DEV_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA,
3138                           DEV_MAC_TAGS_CFG);
3139
3140        /* Set SMAC of Pause frame (00:00:00:00:00:00) */
3141        ocelot_port_writel(ocelot_port, 0, DEV_MAC_FC_MAC_HIGH_CFG);
3142        ocelot_port_writel(ocelot_port, 0, DEV_MAC_FC_MAC_LOW_CFG);
3143
3144        /* Enable transmission of pause frames */
3145        ocelot_fields_write(ocelot, port, SYS_PAUSE_CFG_PAUSE_ENA, 1);
3146
3147        /* Drop frames with multicast source address */
3148        ocelot_rmw_gix(ocelot, ANA_PORT_DROP_CFG_DROP_MC_SMAC_ENA,
3149                       ANA_PORT_DROP_CFG_DROP_MC_SMAC_ENA,
3150                       ANA_PORT_DROP_CFG, port);
3151
3152        /* Set default VLAN and tag type to 8021Q. */
3153        ocelot_rmw_gix(ocelot, REW_PORT_VLAN_CFG_PORT_TPID(ETH_P_8021Q),
3154                       REW_PORT_VLAN_CFG_PORT_TPID_M,
3155                       REW_PORT_VLAN_CFG, port);
3156
3157        /* Disable source address learning for standalone mode */
3158        ocelot_port_set_learning(ocelot, port, false);
3159
3160        /* Set the port's initial logical port ID value, enable receiving
3161         * frames on it, and configure the MAC address learning type to
3162         * automatic.
3163         */
3164        ocelot_write_gix(ocelot, ANA_PORT_PORT_CFG_LEARNAUTO |
3165                         ANA_PORT_PORT_CFG_RECV_ENA |
3166                         ANA_PORT_PORT_CFG_PORTID_VAL(port),
3167                         ANA_PORT_PORT_CFG, port);
3168
3169        /* Enable vcap lookups */
3170        ocelot_vcap_enable(ocelot, port);
3171}
3172EXPORT_SYMBOL(ocelot_init_port);
3173
3174/* Configure and enable the CPU port module, which is a set of queues
3175 * accessible through register MMIO, frame DMA or Ethernet (in case
3176 * NPI mode is used).
3177 */
3178static void ocelot_cpu_port_init(struct ocelot *ocelot)
3179{
3180        int cpu = ocelot->num_phys_ports;
3181
3182        /* The unicast destination PGID for the CPU port module is unused */
3183        ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, cpu);
3184        /* Instead set up a multicast destination PGID for traffic copied to
3185         * the CPU. Whitelisted MAC addresses like the port netdevice MAC
3186         * addresses will be copied to the CPU via this PGID.
3187         */
3188        ocelot_write_rix(ocelot, BIT(cpu), ANA_PGID_PGID, PGID_CPU);
3189        ocelot_write_gix(ocelot, ANA_PORT_PORT_CFG_RECV_ENA |
3190                         ANA_PORT_PORT_CFG_PORTID_VAL(cpu),
3191                         ANA_PORT_PORT_CFG, cpu);
3192
3193        /* Enable CPU port module */
3194        ocelot_fields_write(ocelot, cpu, QSYS_SWITCH_PORT_MODE_PORT_ENA, 1);
3195        /* CPU port Injection/Extraction configuration */
3196        ocelot_fields_write(ocelot, cpu, SYS_PORT_MODE_INCL_XTR_HDR,
3197                            OCELOT_TAG_PREFIX_NONE);
3198        ocelot_fields_write(ocelot, cpu, SYS_PORT_MODE_INCL_INJ_HDR,
3199                            OCELOT_TAG_PREFIX_NONE);
3200
3201        /* Configure the CPU port to be VLAN aware */
3202        ocelot_write_gix(ocelot,
3203                         ANA_PORT_VLAN_CFG_VLAN_VID(OCELOT_STANDALONE_PVID) |
3204                         ANA_PORT_VLAN_CFG_VLAN_AWARE_ENA |
3205                         ANA_PORT_VLAN_CFG_VLAN_POP_CNT(1),
3206                         ANA_PORT_VLAN_CFG, cpu);
3207}
3208
3209static void ocelot_detect_features(struct ocelot *ocelot)
3210{
3211        int mmgt, eq_ctrl;
3212
3213        /* For Ocelot, Felix, Seville, Serval etc, SYS:MMGT:MMGT:FREECNT holds
3214         * the number of 240-byte free memory words (aka 4-cell chunks) and not
3215         * 192 bytes as the documentation incorrectly says.
3216         */
3217        mmgt = ocelot_read(ocelot, SYS_MMGT);
3218        ocelot->packet_buffer_size = 240 * SYS_MMGT_FREECNT(mmgt);
3219
3220        eq_ctrl = ocelot_read(ocelot, QSYS_EQ_CTRL);
3221        ocelot->num_frame_refs = QSYS_MMGT_EQ_CTRL_FP_FREE_CNT(eq_ctrl);
3222}
3223
3224int ocelot_init(struct ocelot *ocelot)
3225{
3226        char queue_name[32];
3227        int i, ret;
3228        u32 port;
3229
3230        if (ocelot->ops->reset) {
3231                ret = ocelot->ops->reset(ocelot);
3232                if (ret) {
3233                        dev_err(ocelot->dev, "Switch reset failed\n");
3234                        return ret;
3235                }
3236        }
3237
3238        ocelot->stats = devm_kcalloc(ocelot->dev,
3239                                     ocelot->num_phys_ports * ocelot->num_stats,
3240                                     sizeof(u64), GFP_KERNEL);
3241        if (!ocelot->stats)
3242                return -ENOMEM;
3243
3244        mutex_init(&ocelot->stats_lock);
3245        mutex_init(&ocelot->ptp_lock);
3246        mutex_init(&ocelot->mact_lock);
3247        mutex_init(&ocelot->fwd_domain_lock);
3248        spin_lock_init(&ocelot->ptp_clock_lock);
3249        spin_lock_init(&ocelot->ts_id_lock);
3250        snprintf(queue_name, sizeof(queue_name), "%s-stats",
3251                 dev_name(ocelot->dev));
3252        ocelot->stats_queue = create_singlethread_workqueue(queue_name);
3253        if (!ocelot->stats_queue)
3254                return -ENOMEM;
3255
3256        ocelot->owq = alloc_ordered_workqueue("ocelot-owq", 0);
3257        if (!ocelot->owq) {
3258                destroy_workqueue(ocelot->stats_queue);
3259                return -ENOMEM;
3260        }
3261
3262        INIT_LIST_HEAD(&ocelot->multicast);
3263        INIT_LIST_HEAD(&ocelot->pgids);
3264        INIT_LIST_HEAD(&ocelot->vlans);
3265        INIT_LIST_HEAD(&ocelot->lag_fdbs);
3266        ocelot_detect_features(ocelot);
3267        ocelot_mact_init(ocelot);
3268        ocelot_vlan_init(ocelot);
3269        ocelot_vcap_init(ocelot);
3270        ocelot_cpu_port_init(ocelot);
3271
3272        if (ocelot->ops->psfp_init)
3273                ocelot->ops->psfp_init(ocelot);
3274
3275        for (port = 0; port < ocelot->num_phys_ports; port++) {
3276                /* Clear all counters (5 groups) */
3277                ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(port) |
3278                                     SYS_STAT_CFG_STAT_CLEAR_SHOT(0x7f),
3279                             SYS_STAT_CFG);
3280        }
3281
3282        /* Only use S-Tag */
3283        ocelot_write(ocelot, ETH_P_8021AD, SYS_VLAN_ETYPE_CFG);
3284
3285        /* Aggregation mode */
3286        ocelot_write(ocelot, ANA_AGGR_CFG_AC_SMAC_ENA |
3287                             ANA_AGGR_CFG_AC_DMAC_ENA |
3288                             ANA_AGGR_CFG_AC_IP4_SIPDIP_ENA |
3289                             ANA_AGGR_CFG_AC_IP4_TCPUDP_ENA |
3290                             ANA_AGGR_CFG_AC_IP6_FLOW_LBL_ENA |
3291                             ANA_AGGR_CFG_AC_IP6_TCPUDP_ENA,
3292                             ANA_AGGR_CFG);
3293
3294        /* Set MAC age time to default value. The entry is aged after
3295         * 2*AGE_PERIOD
3296         */
3297        ocelot_write(ocelot,
3298                     ANA_AUTOAGE_AGE_PERIOD(BR_DEFAULT_AGEING_TIME / 2 / HZ),
3299                     ANA_AUTOAGE);
3300
3301        /* Disable learning for frames discarded by VLAN ingress filtering */
3302        regmap_field_write(ocelot->regfields[ANA_ADVLEARN_VLAN_CHK], 1);
3303
3304        /* Setup frame ageing - fixed value "2 sec" - in 6.5 us units */
3305        ocelot_write(ocelot, SYS_FRM_AGING_AGE_TX_ENA |
3306                     SYS_FRM_AGING_MAX_AGE(307692), SYS_FRM_AGING);
3307
3308        /* Setup flooding PGIDs */
3309        for (i = 0; i < ocelot->num_flooding_pgids; i++)
3310                ocelot_write_rix(ocelot, ANA_FLOODING_FLD_MULTICAST(PGID_MC) |
3311                                 ANA_FLOODING_FLD_BROADCAST(PGID_BC) |
3312                                 ANA_FLOODING_FLD_UNICAST(PGID_UC),
3313                                 ANA_FLOODING, i);
3314        ocelot_write(ocelot, ANA_FLOODING_IPMC_FLD_MC6_DATA(PGID_MCIPV6) |
3315                     ANA_FLOODING_IPMC_FLD_MC6_CTRL(PGID_MC) |
3316                     ANA_FLOODING_IPMC_FLD_MC4_DATA(PGID_MCIPV4) |
3317                     ANA_FLOODING_IPMC_FLD_MC4_CTRL(PGID_MC),
3318                     ANA_FLOODING_IPMC);
3319
3320        for (port = 0; port < ocelot->num_phys_ports; port++) {
3321                /* Transmit the frame to the local port. */
3322                ocelot_write_rix(ocelot, BIT(port), ANA_PGID_PGID, port);
3323                /* Do not forward BPDU frames to the front ports. */
3324                ocelot_write_gix(ocelot,
3325                                 ANA_PORT_CPU_FWD_BPDU_CFG_BPDU_REDIR_ENA(0xffff),
3326                                 ANA_PORT_CPU_FWD_BPDU_CFG,
3327                                 port);
3328                /* Ensure bridging is disabled */
3329                ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, PGID_SRC + port);
3330        }
3331
3332        for_each_nonreserved_multicast_dest_pgid(ocelot, i) {
3333                u32 val = ANA_PGID_PGID_PGID(GENMASK(ocelot->num_phys_ports - 1, 0));
3334
3335                ocelot_write_rix(ocelot, val, ANA_PGID_PGID, i);
3336        }
3337
3338        ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, PGID_BLACKHOLE);
3339
3340        /* Allow broadcast and unknown L2 multicast to the CPU. */
3341        ocelot_rmw_rix(ocelot, ANA_PGID_PGID_PGID(BIT(ocelot->num_phys_ports)),
3342                       ANA_PGID_PGID_PGID(BIT(ocelot->num_phys_ports)),
3343                       ANA_PGID_PGID, PGID_MC);
3344        ocelot_rmw_rix(ocelot, ANA_PGID_PGID_PGID(BIT(ocelot->num_phys_ports)),
3345                       ANA_PGID_PGID_PGID(BIT(ocelot->num_phys_ports)),
3346                       ANA_PGID_PGID, PGID_BC);
3347        ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, PGID_MCIPV4);
3348        ocelot_write_rix(ocelot, 0, ANA_PGID_PGID, PGID_MCIPV6);
3349
3350        /* Allow manual injection via DEVCPU_QS registers, and byte swap these
3351         * registers endianness.
3352         */
3353        ocelot_write_rix(ocelot, QS_INJ_GRP_CFG_BYTE_SWAP |
3354                         QS_INJ_GRP_CFG_MODE(1), QS_INJ_GRP_CFG, 0);
3355        ocelot_write_rix(ocelot, QS_XTR_GRP_CFG_BYTE_SWAP |
3356                         QS_XTR_GRP_CFG_MODE(1), QS_XTR_GRP_CFG, 0);
3357        ocelot_write(ocelot, ANA_CPUQ_CFG_CPUQ_MIRROR(2) |
3358                     ANA_CPUQ_CFG_CPUQ_LRN(2) |
3359                     ANA_CPUQ_CFG_CPUQ_MAC_COPY(2) |
3360                     ANA_CPUQ_CFG_CPUQ_SRC_COPY(2) |
3361                     ANA_CPUQ_CFG_CPUQ_LOCKED_PORTMOVE(2) |
3362                     ANA_CPUQ_CFG_CPUQ_ALLBRIDGE(6) |
3363                     ANA_CPUQ_CFG_CPUQ_IPMC_CTRL(6) |
3364                     ANA_CPUQ_CFG_CPUQ_IGMP(6) |
3365                     ANA_CPUQ_CFG_CPUQ_MLD(6), ANA_CPUQ_CFG);
3366        for (i = 0; i < 16; i++)
3367                ocelot_write_rix(ocelot, ANA_CPUQ_8021_CFG_CPUQ_GARP_VAL(6) |
3368                                 ANA_CPUQ_8021_CFG_CPUQ_BPDU_VAL(6),
3369                                 ANA_CPUQ_8021_CFG, i);
3370
3371        ret = ocelot_prepare_stats_regions(ocelot);
3372        if (ret) {
3373                destroy_workqueue(ocelot->stats_queue);
3374                destroy_workqueue(ocelot->owq);
3375                return ret;
3376        }
3377
3378        INIT_DELAYED_WORK(&ocelot->stats_work, ocelot_check_stats_work);
3379        queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work,
3380                           OCELOT_STATS_CHECK_DELAY);
3381
3382        return 0;
3383}
3384EXPORT_SYMBOL(ocelot_init);
3385
3386void ocelot_deinit(struct ocelot *ocelot)
3387{
3388        cancel_delayed_work(&ocelot->stats_work);
3389        destroy_workqueue(ocelot->stats_queue);
3390        destroy_workqueue(ocelot->owq);
3391        mutex_destroy(&ocelot->stats_lock);
3392}
3393EXPORT_SYMBOL(ocelot_deinit);
3394
3395void ocelot_deinit_port(struct ocelot *ocelot, int port)
3396{
3397        struct ocelot_port *ocelot_port = ocelot->ports[port];
3398
3399        skb_queue_purge(&ocelot_port->tx_skbs);
3400}
3401EXPORT_SYMBOL(ocelot_deinit_port);
3402
3403MODULE_LICENSE("Dual MIT/GPL");
3404