Lines Matching +full:dp +full:- +full:bridge
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * include/net/dsa.h - Driver for Distributed Switch Architecture switch chips
4 * Copyright (c) 2008-2009 Marvell Semiconductor
126 /* Notifier chain for switch-wide events */
135 /* Maps offloaded LAG netdevs to a zero-based linear ID for
167 /* LAG IDs are one-based, the dst->lags array is zero-based */
169 for ((_id) = 1; (_id) <= (_dst)->lags_len; (_id)++) \
170 if ((_dst)->lags[(_id) - 1])
173 list_for_each_entry((_dp), &(_dst)->ports, list) \
177 list_for_each_entry((_dp), &(_ds)->dst->ports, list) \
178 if ((_dp)->ds == (_ds) && (_dp)->hsr_dev == (_hsr))
183 /* DSA LAG IDs are one-based, dst->lags is zero-based */ in dsa_lag_by_id()
184 return dst->lags[id - 1]; in dsa_lag_by_id()
195 if (lag->dev == lag_dev) in dsa_lag_id()
196 return lag->id; in dsa_lag_id()
199 return -ENODEV; in dsa_lag_id()
296 struct dsa_bridge *bridge; member
330 /* TODO: ideally DSA ports would have a single dp->link_dp member,
331 * and no dst->rtable nor this struct dsa_link would be needed,
336 struct dsa_port *dp; member
351 const struct dsa_port *dp; member
353 struct dsa_bridge bridge; member
386 /* Disallow bridge core from requesting different VLAN awareness
387 * settings on ports if not hardware-supported
404 * bridge's default_pvid VLAN tagged frames to offer a consistent
405 * behavior between a vlan_filtering=0 and vlan_filtering=1 bridge
411 * CPU, based on the software bridge database.
416 * should be retrieved from here and not from the per-port settings.
427 * to true to receive the bridge as an argument in .port_fdb_{add,del}
428 * and .port_mdb_{add,del}. Otherwise, the bridge.num will always be
481 /* Drivers that support bridge forwarding offload or FDB isolation
483 * switch tree (or all trees, in the case of cross-tree bridging
493 struct dsa_switch_tree *dst = ds->dst; in dsa_to_port()
494 struct dsa_port *dp; in dsa_to_port() local
496 list_for_each_entry(dp, &dst->ports, list) in dsa_to_port()
497 if (dp->ds == ds && dp->index == p) in dsa_to_port()
498 return dp; in dsa_to_port()
505 return port->type == DSA_PORT_TYPE_DSA; in dsa_port_is_dsa()
510 return port->type == DSA_PORT_TYPE_CPU; in dsa_port_is_cpu()
513 static inline bool dsa_port_is_user(struct dsa_port *dp) in dsa_port_is_user() argument
515 return dp->type == DSA_PORT_TYPE_USER; in dsa_port_is_user()
518 static inline bool dsa_port_is_unused(struct dsa_port *dp) in dsa_port_is_unused() argument
520 return dp->type == DSA_PORT_TYPE_UNUSED; in dsa_port_is_unused()
523 static inline bool dsa_port_master_is_operational(struct dsa_port *dp) in dsa_port_master_is_operational() argument
525 return dsa_port_is_cpu(dp) && dp->master_admin_up && in dsa_port_master_is_operational()
526 dp->master_oper_up; in dsa_port_master_is_operational()
531 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_UNUSED; in dsa_is_unused_port()
536 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_CPU; in dsa_is_cpu_port()
541 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_DSA; in dsa_is_dsa_port()
546 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_USER; in dsa_is_user_port()
550 list_for_each_entry((_dp), &(_dst)->ports, list) \
554 list_for_each_entry_continue_reverse((_dp), &(_dst)->ports, list) \
558 list_for_each_entry((_dp), &(_dst)->ports, list) \
562 list_for_each_entry((_dp), &(_ds)->dst->ports, list) \
563 if ((_dp)->ds == (_ds))
566 list_for_each_entry_safe((_dp), (_next), &(_ds)->dst->ports, list) \
567 if ((_dp)->ds == (_ds))
570 list_for_each_entry_continue_reverse((_dp), &(_ds)->dst->ports, list) \
571 if ((_dp)->ds == (_ds))
591 struct dsa_port *dp; in dsa_user_ports() local
594 dsa_switch_for_each_user_port(dp, ds) in dsa_user_ports()
595 mask |= BIT(dp->index); in dsa_user_ports()
606 mask |= BIT(cpu_dp->index); in dsa_cpu_ports()
614 struct dsa_switch_tree *dst = ds->dst; in dsa_routing_port()
617 list_for_each_entry(dl, &dst->rtable, list) in dsa_routing_port()
618 if (dl->dp->ds == ds && dl->link_dp->ds->index == device) in dsa_routing_port()
619 return dl->dp->index; in dsa_routing_port()
621 return ds->num_ports; in dsa_routing_port()
628 if (device == ds->index) in dsa_towards_port()
637 const struct dsa_port *dp = dsa_to_port(ds, port); in dsa_upstream_port() local
638 const struct dsa_port *cpu_dp = dp->cpu_dp; in dsa_upstream_port()
643 return dsa_towards_port(ds, cpu_dp->ds->index, cpu_dp->index); in dsa_upstream_port()
664 struct dsa_port *dp; in dsa_switch_upstream_port() local
666 dsa_switch_for_each_available_port(dp, ds) { in dsa_switch_upstream_port()
667 return dsa_upstream_port(ds, dp->index); in dsa_switch_upstream_port()
670 return ds->num_ports; in dsa_switch_upstream_port()
685 routing_port = dsa_routing_port(downstream_ds, upstream_ds->index); in dsa_switch_is_upstream_of()
690 static inline bool dsa_port_is_vlan_filtering(const struct dsa_port *dp) in dsa_port_is_vlan_filtering() argument
692 const struct dsa_switch *ds = dp->ds; in dsa_port_is_vlan_filtering()
694 if (ds->vlan_filtering_is_global) in dsa_port_is_vlan_filtering()
695 return ds->vlan_filtering; in dsa_port_is_vlan_filtering()
697 return dp->vlan_filtering; in dsa_port_is_vlan_filtering()
700 static inline unsigned int dsa_port_lag_id_get(struct dsa_port *dp) in dsa_port_lag_id_get() argument
702 return dp->lag ? dp->lag->id : 0; in dsa_port_lag_id_get()
705 static inline struct net_device *dsa_port_lag_dev_get(struct dsa_port *dp) in dsa_port_lag_dev_get() argument
707 return dp->lag ? dp->lag->dev : NULL; in dsa_port_lag_dev_get()
710 static inline bool dsa_port_offloads_lag(struct dsa_port *dp, in dsa_port_offloads_lag() argument
713 return dsa_port_lag_dev_get(dp) == lag->dev; in dsa_port_offloads_lag()
716 static inline struct net_device *dsa_port_to_master(const struct dsa_port *dp) in dsa_port_to_master() argument
718 if (dp->cpu_port_in_lag) in dsa_port_to_master()
719 return dsa_port_lag_dev_get(dp->cpu_dp); in dsa_port_to_master()
721 return dp->cpu_dp->master; in dsa_port_to_master()
725 struct net_device *dsa_port_to_bridge_port(const struct dsa_port *dp) in dsa_port_to_bridge_port() argument
727 if (!dp->bridge) in dsa_port_to_bridge_port()
730 if (dp->lag) in dsa_port_to_bridge_port()
731 return dp->lag->dev; in dsa_port_to_bridge_port()
732 else if (dp->hsr_dev) in dsa_port_to_bridge_port()
733 return dp->hsr_dev; in dsa_port_to_bridge_port()
735 return dp->slave; in dsa_port_to_bridge_port()
739 dsa_port_bridge_dev_get(const struct dsa_port *dp) in dsa_port_bridge_dev_get() argument
741 return dp->bridge ? dp->bridge->dev : NULL; in dsa_port_bridge_dev_get()
744 static inline unsigned int dsa_port_bridge_num_get(struct dsa_port *dp) in dsa_port_bridge_num_get() argument
746 return dp->bridge ? dp->bridge->num : 0; in dsa_port_bridge_num_get()
755 /* Standalone ports are not in the same bridge with one another */ in dsa_port_bridge_same()
759 static inline bool dsa_port_offloads_bridge_port(struct dsa_port *dp, in dsa_port_offloads_bridge_port() argument
762 return dsa_port_to_bridge_port(dp) == dev; in dsa_port_offloads_bridge_port()
766 dsa_port_offloads_bridge_dev(struct dsa_port *dp, in dsa_port_offloads_bridge_dev() argument
769 /* DSA ports connected to a bridge, and event was emitted in dsa_port_offloads_bridge_dev()
770 * for the bridge. in dsa_port_offloads_bridge_dev()
772 return dsa_port_bridge_dev_get(dp) == bridge_dev; in dsa_port_offloads_bridge_dev()
775 static inline bool dsa_port_offloads_bridge(struct dsa_port *dp, in dsa_port_offloads_bridge() argument
776 const struct dsa_bridge *bridge) in dsa_port_offloads_bridge() argument
778 return dsa_port_bridge_dev_get(dp) == bridge->dev; in dsa_port_offloads_bridge()
785 struct dsa_port *dp; in dsa_tree_offloads_bridge_port() local
787 list_for_each_entry(dp, &dst->ports, list) in dsa_tree_offloads_bridge_port()
788 if (dsa_port_offloads_bridge_port(dp, dev)) in dsa_tree_offloads_bridge_port()
794 /* Returns true if any port of this tree offloads the given bridge */
799 struct dsa_port *dp; in dsa_tree_offloads_bridge_dev() local
801 list_for_each_entry(dp, &dst->ports, list) in dsa_tree_offloads_bridge_dev()
802 if (dsa_port_offloads_bridge_dev(dp, bridge_dev)) in dsa_tree_offloads_bridge_dev()
811 return a->ds->dst == b->ds->dst; in dsa_port_tree_same()
841 /* Optional switch-wide initialization and destruction methods */
845 /* Per-port initialization and destruction methods. Mandatory if the
923 * ethtool Wake-on-LAN
1009 * Bridge integration
1013 struct dsa_bridge bridge,
1017 struct dsa_bridge bridge);
1044 int (*vlan_msti_set)(struct dsa_switch *ds, struct dsa_bridge bridge,
1103 * Cross-chip operations
1107 struct dsa_bridge bridge,
1111 struct dsa_bridge bridge);
1282 return dl_priv->ds; in dsa_devlink_to_ds()
1288 struct devlink *dl = port->devlink; in dsa_devlink_port_to_ds()
1291 return dl_priv->ds; in dsa_devlink_port_to_ds()
1296 return port->index; in dsa_devlink_port_to_port()
1315 return dev->dsa_ptr && dev->dsa_ptr->rcv; in netdev_uses_dsa()
1325 * - offset: the (B - A) difference between:
1327 * B. the current skb->data (aka ETH_HLEN bytes into the frame, aka 2 bytes
1332 * - proto: the value of the real EtherType.
1338 const struct dsa_device_ops *ops = skb->dev->dsa_ptr->tag_ops; in dsa_tag_generic_flow_dissect()
1339 int tag_len = ops->needed_headroom; in dsa_tag_generic_flow_dissect()
1342 *proto = ((__be16 *)skb->data)[(tag_len / 2) - 1]; in dsa_tag_generic_flow_dissect()