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 68 struct mlxsw_sp_port; 69 struct mlxsw_sp_rif; 70 71 struct mlxsw_sp_upper { 72 struct net_device *dev; 73 unsigned int ref_count; 74 }; 75 76 enum 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 83 enum 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 91 struct 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 99 enum mlxsw_sp_span_type { 100 MLXSW_SP_SPAN_EGRESS, 101 MLXSW_SP_SPAN_INGRESS 102 }; 103 104 struct mlxsw_sp_span_inspected_port { 105 struct list_head list; 106 enum mlxsw_sp_span_type type; 107 u8 local_port; 108 }; 109 110 struct 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 118 enum mlxsw_sp_port_mall_action_type { 119 MLXSW_SP_PORT_MALL_MIRROR, 120 MLXSW_SP_PORT_MALL_SAMPLE, 121 }; 122 123 struct mlxsw_sp_port_mall_mirror_tc_entry { 124 u8 to_local_port; 125 bool ingress; 126 }; 127 128 struct 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 137 struct mlxsw_sp_sb; 138 struct mlxsw_sp_bridge; 139 struct mlxsw_sp_router; 140 struct mlxsw_sp_acl; 141 struct mlxsw_sp_counter_pool; 142 struct mlxsw_sp_fid_core; 143 144 struct 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 167 static inline struct mlxsw_sp_upper * 168 mlxsw_sp_lag_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id) 169 { 170 return &mlxsw_sp->lags[lag_id]; 171 } 172 173 struct 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 182 struct mlxsw_sp_port_sample { 183 struct psample_group __rcu *psample_group; 184 u32 trunc_size; 185 u32 rate; 186 bool truncate; 187 }; 188 189 struct mlxsw_sp_bridge_port; 190 struct mlxsw_sp_fid; 191 192 struct 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 201 struct 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 236 static inline bool 237 mlxsw_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 242 static inline struct mlxsw_sp_port * 243 mlxsw_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 254 static inline struct mlxsw_sp_port_vlan * 255 mlxsw_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 269 enum 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 */ 276 int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp); 277 void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp); 278 int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port); 279 int 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); 282 int 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); 285 int 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); 288 int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port, 289 unsigned int sb_index, u16 pool_index, 290 u32 threshold); 291 int 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); 295 int 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); 299 int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core, 300 unsigned int sb_index); 301 int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core, 302 unsigned int sb_index); 303 int 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); 306 int 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); 310 u32 mlxsw_sp_cells_bytes(const struct mlxsw_sp *mlxsw_sp, u32 cells); 311 u32 mlxsw_sp_bytes_cells(const struct mlxsw_sp *mlxsw_sp, u32 bytes); 312 313 /* spectrum_switchdev.c */ 314 int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp); 315 void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp); 316 void mlxsw_sp_port_switchdev_init(struct mlxsw_sp_port *mlxsw_sp_port); 317 void mlxsw_sp_port_switchdev_fini(struct mlxsw_sp_port *mlxsw_sp_port); 318 int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid, 319 bool adding); 320 void 321 mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan); 322 int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port, 323 struct net_device *brport_dev, 324 struct net_device *br_dev); 325 void 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 */ 330 int 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); 333 int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port, 334 u8 switch_prio, u8 tclass); 335 int __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); 338 int 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); 341 int mlxsw_sp_port_vid_stp_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid, 342 u8 state); 343 int mlxsw_sp_port_vp_mode_set(struct mlxsw_sp_port *mlxsw_sp_port, bool enable); 344 int mlxsw_sp_port_vid_learning_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid, 345 bool learn_enable); 346 int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); 347 struct mlxsw_sp_port_vlan * 348 mlxsw_sp_port_vlan_get(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); 349 void mlxsw_sp_port_vlan_put(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan); 350 int mlxsw_sp_port_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid_begin, 351 u16 vid_end, bool is_member, bool untagged); 352 int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp, 353 unsigned int counter_index, u64 *packets, 354 u64 *bytes); 355 int mlxsw_sp_flow_counter_alloc(struct mlxsw_sp *mlxsw_sp, 356 unsigned int *p_counter_index); 357 void mlxsw_sp_flow_counter_free(struct mlxsw_sp *mlxsw_sp, 358 unsigned int counter_index); 359 bool mlxsw_sp_port_dev_check(const struct net_device *dev); 360 struct mlxsw_sp *mlxsw_sp_lower_get(struct net_device *dev); 361 struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find(struct net_device *dev); 362 struct mlxsw_sp_port *mlxsw_sp_port_lower_dev_hold(struct net_device *dev); 363 void mlxsw_sp_port_dev_put(struct mlxsw_sp_port *mlxsw_sp_port); 364 struct 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 368 int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port); 369 void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port); 370 #else 371 static inline int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port) 372 { 373 return 0; 374 } 375 static inline void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port) 376 {} 377 #endif 378 379 /* spectrum_router.c */ 380 int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp); 381 void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp); 382 int mlxsw_sp_router_netevent_event(struct notifier_block *unused, 383 unsigned long event, void *ptr); 384 int mlxsw_sp_netdevice_router_port_event(struct net_device *dev); 385 int mlxsw_sp_inetaddr_event(struct notifier_block *unused, 386 unsigned long event, void *ptr); 387 int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event, 388 struct netdev_notifier_changeupper_info *info); 389 void 390 mlxsw_sp_port_vlan_router_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan); 391 void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif); 392 393 /* spectrum_kvdl.c */ 394 int mlxsw_sp_kvdl_alloc(struct mlxsw_sp *mlxsw_sp, unsigned int entry_count, 395 u32 *p_entry_index); 396 void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp, int entry_index); 397 398 struct 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 406 enum mlxsw_sp_acl_profile { 407 MLXSW_SP_ACL_PROFILE_FLOWER, 408 }; 409 410 struct 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 427 struct 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 436 struct mlxsw_sp_acl_ruleset; 437 438 /* spectrum_acl.c */ 439 struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl); 440 struct mlxsw_sp_acl_ruleset * 441 mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, 442 struct net_device *dev, bool ingress, 443 enum mlxsw_sp_acl_profile profile); 444 void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp, 445 struct mlxsw_sp_acl_ruleset *ruleset); 446 447 struct mlxsw_sp_acl_rule_info * 448 mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl); 449 void mlxsw_sp_acl_rulei_destroy(struct mlxsw_sp_acl_rule_info *rulei); 450 int mlxsw_sp_acl_rulei_commit(struct mlxsw_sp_acl_rule_info *rulei); 451 void mlxsw_sp_acl_rulei_priority(struct mlxsw_sp_acl_rule_info *rulei, 452 unsigned int priority); 453 void 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); 456 void 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); 460 void mlxsw_sp_acl_rulei_act_continue(struct mlxsw_sp_acl_rule_info *rulei); 461 void mlxsw_sp_acl_rulei_act_jump(struct mlxsw_sp_acl_rule_info *rulei, 462 u16 group_id); 463 int mlxsw_sp_acl_rulei_act_drop(struct mlxsw_sp_acl_rule_info *rulei); 464 int mlxsw_sp_acl_rulei_act_trap(struct mlxsw_sp_acl_rule_info *rulei); 465 int 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); 468 int 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); 471 int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp, 472 struct mlxsw_sp_acl_rule_info *rulei); 473 int mlxsw_sp_acl_rulei_act_fid_set(struct mlxsw_sp *mlxsw_sp, 474 struct mlxsw_sp_acl_rule_info *rulei, 475 u16 fid); 476 477 struct mlxsw_sp_acl_rule; 478 479 struct mlxsw_sp_acl_rule * 480 mlxsw_sp_acl_rule_create(struct mlxsw_sp *mlxsw_sp, 481 struct mlxsw_sp_acl_ruleset *ruleset, 482 unsigned long cookie); 483 void mlxsw_sp_acl_rule_destroy(struct mlxsw_sp *mlxsw_sp, 484 struct mlxsw_sp_acl_rule *rule); 485 int mlxsw_sp_acl_rule_add(struct mlxsw_sp *mlxsw_sp, 486 struct mlxsw_sp_acl_rule *rule); 487 void mlxsw_sp_acl_rule_del(struct mlxsw_sp *mlxsw_sp, 488 struct mlxsw_sp_acl_rule *rule); 489 struct mlxsw_sp_acl_rule * 490 mlxsw_sp_acl_rule_lookup(struct mlxsw_sp *mlxsw_sp, 491 struct mlxsw_sp_acl_ruleset *ruleset, 492 unsigned long cookie); 493 struct mlxsw_sp_acl_rule_info * 494 mlxsw_sp_acl_rule_rulei(struct mlxsw_sp_acl_rule *rule); 495 int 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 499 struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp); 500 501 int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp); 502 void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp); 503 504 /* spectrum_acl_tcam.c */ 505 extern const struct mlxsw_sp_acl_ops mlxsw_sp_acl_tcam_ops; 506 507 /* spectrum_flower.c */ 508 int mlxsw_sp_flower_replace(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress, 509 __be16 protocol, struct tc_cls_flower_offload *f); 510 void mlxsw_sp_flower_destroy(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress, 511 struct tc_cls_flower_offload *f); 512 int 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 */ 516 int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid, 517 enum mlxsw_sp_flood_type packet_type, u8 local_port, 518 bool member); 519 int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid, 520 struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); 521 void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid, 522 struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); 523 enum mlxsw_sp_rif_type mlxsw_sp_fid_rif_type(const struct mlxsw_sp_fid *fid); 524 u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid); 525 enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid); 526 void mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif); 527 enum mlxsw_sp_rif_type 528 mlxsw_sp_fid_type_rif_type(const struct mlxsw_sp *mlxsw_sp, 529 enum mlxsw_sp_fid_type type); 530 u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid); 531 struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_get(struct mlxsw_sp *mlxsw_sp, u16 vid); 532 struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_get(struct mlxsw_sp *mlxsw_sp, 533 int br_ifindex); 534 struct mlxsw_sp_fid *mlxsw_sp_fid_rfid_get(struct mlxsw_sp *mlxsw_sp, 535 u16 rif_index); 536 struct mlxsw_sp_fid *mlxsw_sp_fid_dummy_get(struct mlxsw_sp *mlxsw_sp); 537 void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid); 538 int mlxsw_sp_port_fids_init(struct mlxsw_sp_port *mlxsw_sp_port); 539 void mlxsw_sp_port_fids_fini(struct mlxsw_sp_port *mlxsw_sp_port); 540 int mlxsw_sp_fids_init(struct mlxsw_sp *mlxsw_sp); 541 void mlxsw_sp_fids_fini(struct mlxsw_sp *mlxsw_sp); 542 543 #endif 544