linux/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
<<
>>
Prefs
   1/*
   2 * drivers/net/ethernet/mellanox/mlxsw/spectrum.h
   3 * Copyright (c) 2015-2017 Mellanox Technologies. All rights reserved.
   4 * Copyright (c) 2015-2017 Jiri Pirko <jiri@mellanox.com>
   5 * Copyright (c) 2015 Ido Schimmel <idosch@mellanox.com>
   6 * Copyright (c) 2015 Elad Raz <eladr@mellanox.com>
   7 *
   8 * Redistribution and use in source and binary forms, with or without
   9 * modification, are permitted provided that the following conditions are met:
  10 *
  11 * 1. Redistributions of source code must retain the above copyright
  12 *    notice, this list of conditions and the following disclaimer.
  13 * 2. Redistributions in binary form must reproduce the above copyright
  14 *    notice, this list of conditions and the following disclaimer in the
  15 *    documentation and/or other materials provided with the distribution.
  16 * 3. Neither the names of the copyright holders nor the names of its
  17 *    contributors may be used to endorse or promote products derived from
  18 *    this software without specific prior written permission.
  19 *
  20 * Alternatively, this software may be distributed under the terms of the
  21 * GNU General Public License ("GPL") version 2 as published by the Free
  22 * Software Foundation.
  23 *
  24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  34 * POSSIBILITY OF SUCH DAMAGE.
  35 */
  36
  37#ifndef _MLXSW_SPECTRUM_H
  38#define _MLXSW_SPECTRUM_H
  39
  40#include <linux/types.h>
  41#include <linux/netdevice.h>
  42#include <linux/rhashtable.h>
  43#include <linux/bitops.h>
  44#include <linux/if_vlan.h>
  45#include <linux/list.h>
  46#include <linux/dcbnl.h>
  47#include <linux/in6.h>
  48#include <linux/notifier.h>
  49#include <net/psample.h>
  50#include <net/pkt_cls.h>
  51
  52#include "port.h"
  53#include "core.h"
  54#include "core_acl_flex_keys.h"
  55#include "core_acl_flex_actions.h"
  56
  57#define MLXSW_SP_FID_8021D_MAX 1024
  58
  59#define MLXSW_SP_MID_MAX 7000
  60
  61#define MLXSW_SP_PORTS_PER_CLUSTER_MAX 4
  62
  63#define MLXSW_SP_PORT_BASE_SPEED 25000  /* Mb/s */
  64
  65#define MLXSW_SP_KVD_LINEAR_SIZE 65536 /* entries */
  66#define MLXSW_SP_KVD_GRANULARITY 128
  67
  68struct mlxsw_sp_port;
  69struct mlxsw_sp_rif;
  70
  71struct mlxsw_sp_upper {
  72        struct net_device *dev;
  73        unsigned int ref_count;
  74};
  75
  76enum mlxsw_sp_rif_type {
  77        MLXSW_SP_RIF_TYPE_SUBPORT,
  78        MLXSW_SP_RIF_TYPE_VLAN,
  79        MLXSW_SP_RIF_TYPE_FID,
  80        MLXSW_SP_RIF_TYPE_MAX,
  81};
  82
  83enum mlxsw_sp_fid_type {
  84        MLXSW_SP_FID_TYPE_8021Q,
  85        MLXSW_SP_FID_TYPE_8021D,
  86        MLXSW_SP_FID_TYPE_RFID,
  87        MLXSW_SP_FID_TYPE_DUMMY,
  88        MLXSW_SP_FID_TYPE_MAX,
  89};
  90
  91struct mlxsw_sp_mid {
  92        struct list_head list;
  93        unsigned char addr[ETH_ALEN];
  94        u16 fid;
  95        u16 mid;
  96        unsigned int ref_count;
  97};
  98
  99enum mlxsw_sp_span_type {
 100        MLXSW_SP_SPAN_EGRESS,
 101        MLXSW_SP_SPAN_INGRESS
 102};
 103
 104struct mlxsw_sp_span_inspected_port {
 105        struct list_head list;
 106        enum mlxsw_sp_span_type type;
 107        u8 local_port;
 108};
 109
 110struct mlxsw_sp_span_entry {
 111        u8 local_port;
 112        bool used;
 113        struct list_head bound_ports_list;
 114        int ref_count;
 115        int id;
 116};
 117
 118enum mlxsw_sp_port_mall_action_type {
 119        MLXSW_SP_PORT_MALL_MIRROR,
 120        MLXSW_SP_PORT_MALL_SAMPLE,
 121};
 122
 123struct mlxsw_sp_port_mall_mirror_tc_entry {
 124        u8 to_local_port;
 125        bool ingress;
 126};
 127
 128struct mlxsw_sp_port_mall_tc_entry {
 129        struct list_head list;
 130        unsigned long cookie;
 131        enum mlxsw_sp_port_mall_action_type type;
 132        union {
 133                struct mlxsw_sp_port_mall_mirror_tc_entry mirror;
 134        };
 135};
 136
 137struct mlxsw_sp_sb;
 138struct mlxsw_sp_bridge;
 139struct mlxsw_sp_router;
 140struct mlxsw_sp_acl;
 141struct mlxsw_sp_counter_pool;
 142struct mlxsw_sp_fid_core;
 143
 144struct mlxsw_sp {
 145        struct mlxsw_sp_port **ports;
 146        struct mlxsw_core *core;
 147        const struct mlxsw_bus_info *bus_info;
 148        unsigned char base_mac[ETH_ALEN];
 149        struct mlxsw_sp_upper *lags;
 150        u8 *port_to_module;
 151        struct mlxsw_sp_sb *sb;
 152        struct mlxsw_sp_bridge *bridge;
 153        struct mlxsw_sp_router *router;
 154        struct mlxsw_sp_acl *acl;
 155        struct mlxsw_sp_fid_core *fid_core;
 156        struct {
 157                DECLARE_BITMAP(usage, MLXSW_SP_KVD_LINEAR_SIZE);
 158        } kvdl;
 159
 160        struct mlxsw_sp_counter_pool *counter_pool;
 161        struct {
 162                struct mlxsw_sp_span_entry *entries;
 163                int entries_count;
 164        } span;
 165};
 166
 167static inline struct mlxsw_sp_upper *
 168mlxsw_sp_lag_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id)
 169{
 170        return &mlxsw_sp->lags[lag_id];
 171}
 172
 173struct mlxsw_sp_port_pcpu_stats {
 174        u64                     rx_packets;
 175        u64                     rx_bytes;
 176        u64                     tx_packets;
 177        u64                     tx_bytes;
 178        struct u64_stats_sync   syncp;
 179        u32                     tx_dropped;
 180};
 181
 182struct mlxsw_sp_port_sample {
 183        struct psample_group __rcu *psample_group;
 184        u32 trunc_size;
 185        u32 rate;
 186        bool truncate;
 187};
 188
 189struct mlxsw_sp_bridge_port;
 190struct mlxsw_sp_fid;
 191
 192struct mlxsw_sp_port_vlan {
 193        struct list_head list;
 194        struct mlxsw_sp_port *mlxsw_sp_port;
 195        struct mlxsw_sp_fid *fid;
 196        u16 vid;
 197        struct mlxsw_sp_bridge_port *bridge_port;
 198        struct list_head bridge_vlan_node;
 199};
 200
 201struct mlxsw_sp_port {
 202        struct net_device *dev;
 203        struct mlxsw_sp_port_pcpu_stats __percpu *pcpu_stats;
 204        struct mlxsw_sp *mlxsw_sp;
 205        u8 local_port;
 206        u8 lagged:1,
 207           split:1;
 208        u16 pvid;
 209        u16 lag_id;
 210        struct {
 211                u8 tx_pause:1,
 212                   rx_pause:1,
 213                   autoneg:1;
 214        } link;
 215        struct {
 216                struct ieee_ets *ets;
 217                struct ieee_maxrate *maxrate;
 218                struct ieee_pfc *pfc;
 219        } dcb;
 220        struct {
 221                u8 module;
 222                u8 width;
 223                u8 lane;
 224        } mapping;
 225        /* TC handles */
 226        struct list_head mall_tc_list;
 227        struct {
 228                #define MLXSW_HW_STATS_UPDATE_TIME HZ
 229                struct rtnl_link_stats64 *cache;
 230                struct delayed_work update_dw;
 231        } hw_stats;
 232        struct mlxsw_sp_port_sample *sample;
 233        struct list_head vlans_list;
 234};
 235
 236static inline bool
 237mlxsw_sp_port_is_pause_en(const struct mlxsw_sp_port *mlxsw_sp_port)
 238{
 239        return mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause;
 240}
 241
 242static inline struct mlxsw_sp_port *
 243mlxsw_sp_port_lagged_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id, u8 port_index)
 244{
 245        struct mlxsw_sp_port *mlxsw_sp_port;
 246        u8 local_port;
 247
 248        local_port = mlxsw_core_lag_mapping_get(mlxsw_sp->core,
 249                                                lag_id, port_index);
 250        mlxsw_sp_port = mlxsw_sp->ports[local_port];
 251        return mlxsw_sp_port && mlxsw_sp_port->lagged ? mlxsw_sp_port : NULL;
 252}
 253
 254static inline struct mlxsw_sp_port_vlan *
 255mlxsw_sp_port_vlan_find_by_vid(const struct mlxsw_sp_port *mlxsw_sp_port,
 256                               u16 vid)
 257{
 258        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
 259
 260        list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
 261                            list) {
 262                if (mlxsw_sp_port_vlan->vid == vid)
 263                        return mlxsw_sp_port_vlan;
 264        }
 265
 266        return NULL;
 267}
 268
 269enum mlxsw_sp_flood_type {
 270        MLXSW_SP_FLOOD_TYPE_UC,
 271        MLXSW_SP_FLOOD_TYPE_BC,
 272        MLXSW_SP_FLOOD_TYPE_MC,
 273};
 274
 275/* spectrum_buffers.c */
 276int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp);
 277void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp);
 278int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port);
 279int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core,
 280                         unsigned int sb_index, u16 pool_index,
 281                         struct devlink_sb_pool_info *pool_info);
 282int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core,
 283                         unsigned int sb_index, u16 pool_index, u32 size,
 284                         enum devlink_sb_threshold_type threshold_type);
 285int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
 286                              unsigned int sb_index, u16 pool_index,
 287                              u32 *p_threshold);
 288int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,
 289                              unsigned int sb_index, u16 pool_index,
 290                              u32 threshold);
 291int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port,
 292                                 unsigned int sb_index, u16 tc_index,
 293                                 enum devlink_sb_pool_type pool_type,
 294                                 u16 *p_pool_index, u32 *p_threshold);
 295int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,
 296                                 unsigned int sb_index, u16 tc_index,
 297                                 enum devlink_sb_pool_type pool_type,
 298                                 u16 pool_index, u32 threshold);
 299int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
 300                             unsigned int sb_index);
 301int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
 302                              unsigned int sb_index);
 303int mlxsw_sp_sb_occ_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
 304                                  unsigned int sb_index, u16 pool_index,
 305                                  u32 *p_cur, u32 *p_max);
 306int mlxsw_sp_sb_occ_tc_port_bind_get(struct mlxsw_core_port *mlxsw_core_port,
 307                                     unsigned int sb_index, u16 tc_index,
 308                                     enum devlink_sb_pool_type pool_type,
 309                                     u32 *p_cur, u32 *p_max);
 310u32 mlxsw_sp_cells_bytes(const struct mlxsw_sp *mlxsw_sp, u32 cells);
 311u32 mlxsw_sp_bytes_cells(const struct mlxsw_sp *mlxsw_sp, u32 bytes);
 312
 313/* spectrum_switchdev.c */
 314int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp);
 315void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp);
 316void mlxsw_sp_port_switchdev_init(struct mlxsw_sp_port *mlxsw_sp_port);
 317void mlxsw_sp_port_switchdev_fini(struct mlxsw_sp_port *mlxsw_sp_port);
 318int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
 319                        bool adding);
 320void
 321mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
 322int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
 323                              struct net_device *brport_dev,
 324                              struct net_device *br_dev);
 325void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
 326                                struct net_device *brport_dev,
 327                                struct net_device *br_dev);
 328
 329/* spectrum.c */
 330int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
 331                          enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index,
 332                          bool dwrr, u8 dwrr_weight);
 333int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port,
 334                              u8 switch_prio, u8 tclass);
 335int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,
 336                                 u8 *prio_tc, bool pause_en,
 337                                 struct ieee_pfc *my_pfc);
 338int mlxsw_sp_port_ets_maxrate_set(struct mlxsw_sp_port *mlxsw_sp_port,
 339                                  enum mlxsw_reg_qeec_hr hr, u8 index,
 340                                  u8 next_index, u32 maxrate);
 341int mlxsw_sp_port_vid_stp_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
 342                              u8 state);
 343int mlxsw_sp_port_vp_mode_set(struct mlxsw_sp_port *mlxsw_sp_port, bool enable);
 344int mlxsw_sp_port_vid_learning_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
 345                                   bool learn_enable);
 346int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
 347struct mlxsw_sp_port_vlan *
 348mlxsw_sp_port_vlan_get(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
 349void mlxsw_sp_port_vlan_put(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
 350int mlxsw_sp_port_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid_begin,
 351                           u16 vid_end, bool is_member, bool untagged);
 352int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp,
 353                              unsigned int counter_index, u64 *packets,
 354                              u64 *bytes);
 355int mlxsw_sp_flow_counter_alloc(struct mlxsw_sp *mlxsw_sp,
 356                                unsigned int *p_counter_index);
 357void mlxsw_sp_flow_counter_free(struct mlxsw_sp *mlxsw_sp,
 358                                unsigned int counter_index);
 359bool mlxsw_sp_port_dev_check(const struct net_device *dev);
 360struct mlxsw_sp *mlxsw_sp_lower_get(struct net_device *dev);
 361struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find(struct net_device *dev);
 362struct mlxsw_sp_port *mlxsw_sp_port_lower_dev_hold(struct net_device *dev);
 363void mlxsw_sp_port_dev_put(struct mlxsw_sp_port *mlxsw_sp_port);
 364struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find_rcu(struct net_device *dev);
 365
 366/* spectrum_dcb.c */
 367#ifdef CONFIG_MLXSW_SPECTRUM_DCB
 368int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port);
 369void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port);
 370#else
 371static inline int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port)
 372{
 373        return 0;
 374}
 375static inline void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port)
 376{}
 377#endif
 378
 379/* spectrum_router.c */
 380int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp);
 381void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp);
 382int mlxsw_sp_router_netevent_event(struct notifier_block *unused,
 383                                   unsigned long event, void *ptr);
 384int mlxsw_sp_netdevice_router_port_event(struct net_device *dev);
 385int mlxsw_sp_inetaddr_event(struct notifier_block *unused,
 386                            unsigned long event, void *ptr);
 387int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event,
 388                                 struct netdev_notifier_changeupper_info *info);
 389void
 390mlxsw_sp_port_vlan_router_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
 391void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif);
 392
 393/* spectrum_kvdl.c */
 394int mlxsw_sp_kvdl_alloc(struct mlxsw_sp *mlxsw_sp, unsigned int entry_count,
 395                        u32 *p_entry_index);
 396void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp, int entry_index);
 397
 398struct mlxsw_sp_acl_rule_info {
 399        unsigned int priority;
 400        struct mlxsw_afk_element_values values;
 401        struct mlxsw_afa_block *act_block;
 402        unsigned int counter_index;
 403        bool counter_valid;
 404};
 405
 406enum mlxsw_sp_acl_profile {
 407        MLXSW_SP_ACL_PROFILE_FLOWER,
 408};
 409
 410struct mlxsw_sp_acl_profile_ops {
 411        size_t ruleset_priv_size;
 412        int (*ruleset_add)(struct mlxsw_sp *mlxsw_sp,
 413                           void *priv, void *ruleset_priv);
 414        void (*ruleset_del)(struct mlxsw_sp *mlxsw_sp, void *ruleset_priv);
 415        int (*ruleset_bind)(struct mlxsw_sp *mlxsw_sp, void *ruleset_priv,
 416                            struct net_device *dev, bool ingress);
 417        void (*ruleset_unbind)(struct mlxsw_sp *mlxsw_sp, void *ruleset_priv);
 418        size_t rule_priv_size;
 419        int (*rule_add)(struct mlxsw_sp *mlxsw_sp,
 420                        void *ruleset_priv, void *rule_priv,
 421                        struct mlxsw_sp_acl_rule_info *rulei);
 422        void (*rule_del)(struct mlxsw_sp *mlxsw_sp, void *rule_priv);
 423        int (*rule_activity_get)(struct mlxsw_sp *mlxsw_sp, void *rule_priv,
 424                                 bool *activity);
 425};
 426
 427struct mlxsw_sp_acl_ops {
 428        size_t priv_size;
 429        int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv);
 430        void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv);
 431        const struct mlxsw_sp_acl_profile_ops *
 432                        (*profile_ops)(struct mlxsw_sp *mlxsw_sp,
 433                                       enum mlxsw_sp_acl_profile profile);
 434};
 435
 436struct mlxsw_sp_acl_ruleset;
 437
 438/* spectrum_acl.c */
 439struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl);
 440struct mlxsw_sp_acl_ruleset *
 441mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp,
 442                         struct net_device *dev, bool ingress,
 443                         enum mlxsw_sp_acl_profile profile);
 444void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp,
 445                              struct mlxsw_sp_acl_ruleset *ruleset);
 446
 447struct mlxsw_sp_acl_rule_info *
 448mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl);
 449void mlxsw_sp_acl_rulei_destroy(struct mlxsw_sp_acl_rule_info *rulei);
 450int mlxsw_sp_acl_rulei_commit(struct mlxsw_sp_acl_rule_info *rulei);
 451void mlxsw_sp_acl_rulei_priority(struct mlxsw_sp_acl_rule_info *rulei,
 452                                 unsigned int priority);
 453void mlxsw_sp_acl_rulei_keymask_u32(struct mlxsw_sp_acl_rule_info *rulei,
 454                                    enum mlxsw_afk_element element,
 455                                    u32 key_value, u32 mask_value);
 456void mlxsw_sp_acl_rulei_keymask_buf(struct mlxsw_sp_acl_rule_info *rulei,
 457                                    enum mlxsw_afk_element element,
 458                                    const char *key_value,
 459                                    const char *mask_value, unsigned int len);
 460void mlxsw_sp_acl_rulei_act_continue(struct mlxsw_sp_acl_rule_info *rulei);
 461void mlxsw_sp_acl_rulei_act_jump(struct mlxsw_sp_acl_rule_info *rulei,
 462                                 u16 group_id);
 463int mlxsw_sp_acl_rulei_act_drop(struct mlxsw_sp_acl_rule_info *rulei);
 464int mlxsw_sp_acl_rulei_act_trap(struct mlxsw_sp_acl_rule_info *rulei);
 465int mlxsw_sp_acl_rulei_act_fwd(struct mlxsw_sp *mlxsw_sp,
 466                               struct mlxsw_sp_acl_rule_info *rulei,
 467                               struct net_device *out_dev);
 468int mlxsw_sp_acl_rulei_act_vlan(struct mlxsw_sp *mlxsw_sp,
 469                                struct mlxsw_sp_acl_rule_info *rulei,
 470                                u32 action, u16 vid, u16 proto, u8 prio);
 471int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
 472                                 struct mlxsw_sp_acl_rule_info *rulei);
 473int mlxsw_sp_acl_rulei_act_fid_set(struct mlxsw_sp *mlxsw_sp,
 474                                   struct mlxsw_sp_acl_rule_info *rulei,
 475                                   u16 fid);
 476
 477struct mlxsw_sp_acl_rule;
 478
 479struct mlxsw_sp_acl_rule *
 480mlxsw_sp_acl_rule_create(struct mlxsw_sp *mlxsw_sp,
 481                         struct mlxsw_sp_acl_ruleset *ruleset,
 482                         unsigned long cookie);
 483void mlxsw_sp_acl_rule_destroy(struct mlxsw_sp *mlxsw_sp,
 484                               struct mlxsw_sp_acl_rule *rule);
 485int mlxsw_sp_acl_rule_add(struct mlxsw_sp *mlxsw_sp,
 486                          struct mlxsw_sp_acl_rule *rule);
 487void mlxsw_sp_acl_rule_del(struct mlxsw_sp *mlxsw_sp,
 488                           struct mlxsw_sp_acl_rule *rule);
 489struct mlxsw_sp_acl_rule *
 490mlxsw_sp_acl_rule_lookup(struct mlxsw_sp *mlxsw_sp,
 491                         struct mlxsw_sp_acl_ruleset *ruleset,
 492                         unsigned long cookie);
 493struct mlxsw_sp_acl_rule_info *
 494mlxsw_sp_acl_rule_rulei(struct mlxsw_sp_acl_rule *rule);
 495int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp,
 496                                struct mlxsw_sp_acl_rule *rule,
 497                                u64 *packets, u64 *bytes, u64 *last_use);
 498
 499struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp);
 500
 501int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp);
 502void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp);
 503
 504/* spectrum_acl_tcam.c */
 505extern const struct mlxsw_sp_acl_ops mlxsw_sp_acl_tcam_ops;
 506
 507/* spectrum_flower.c */
 508int mlxsw_sp_flower_replace(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
 509                            __be16 protocol, struct tc_cls_flower_offload *f);
 510void mlxsw_sp_flower_destroy(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
 511                             struct tc_cls_flower_offload *f);
 512int mlxsw_sp_flower_stats(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
 513                          struct tc_cls_flower_offload *f);
 514
 515/* spectrum_fid.c */
 516int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid,
 517                           enum mlxsw_sp_flood_type packet_type, u8 local_port,
 518                           bool member);
 519int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid,
 520                              struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
 521void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid,
 522                                 struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
 523enum mlxsw_sp_rif_type mlxsw_sp_fid_rif_type(const struct mlxsw_sp_fid *fid);
 524u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid);
 525enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid);
 526void mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif);
 527enum mlxsw_sp_rif_type
 528mlxsw_sp_fid_type_rif_type(const struct mlxsw_sp *mlxsw_sp,
 529                           enum mlxsw_sp_fid_type type);
 530u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid);
 531struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_get(struct mlxsw_sp *mlxsw_sp, u16 vid);
 532struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_get(struct mlxsw_sp *mlxsw_sp,
 533                                            int br_ifindex);
 534struct mlxsw_sp_fid *mlxsw_sp_fid_rfid_get(struct mlxsw_sp *mlxsw_sp,
 535                                           u16 rif_index);
 536struct mlxsw_sp_fid *mlxsw_sp_fid_dummy_get(struct mlxsw_sp *mlxsw_sp);
 537void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid);
 538int mlxsw_sp_port_fids_init(struct mlxsw_sp_port *mlxsw_sp_port);
 539void mlxsw_sp_port_fids_fini(struct mlxsw_sp_port *mlxsw_sp_port);
 540int mlxsw_sp_fids_init(struct mlxsw_sp *mlxsw_sp);
 541void mlxsw_sp_fids_fini(struct mlxsw_sp *mlxsw_sp);
 542
 543#endif
 544