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
127 /* Notifier chain for switch-wide events */
136 /* Maps offloaded LAG netdevs to a zero-based linear ID for
168 /* LAG IDs are one-based, the dst->lags array is zero-based */
170 for ((_id) = 1; (_id) <= (_dst)->lags_len; (_id)++) \
171 if ((_dst)->lags[(_id) - 1])
174 list_for_each_entry((_dp), &(_dst)->ports, list) \
178 list_for_each_entry((_dp), &(_ds)->dst->ports, list) \
179 if ((_dp)->ds == (_ds) && (_dp)->hsr_dev == (_hsr))
184 /* DSA LAG IDs are one-based, dst->lags is zero-based */ in dsa_lag_by_id()
185 return dst->lags[id - 1]; in dsa_lag_by_id()
196 if (lag->dev == lag_dev) in dsa_lag_id()
197 return lag->id; in dsa_lag_id()
200 return -ENODEV; in dsa_lag_id()
241 * exposes a network device to user-space, called 'user' here.
297 struct dsa_bridge *bridge; member
337 /* TODO: ideally DSA ports would have a single dp->link_dp member,
338 * and no dst->rtable nor this struct dsa_link would be needed,
343 struct dsa_port *dp; member
358 const struct dsa_port *dp; member
360 struct dsa_bridge bridge; member
393 /* Disallow bridge core from requesting different VLAN awareness
394 * settings on ports if not hardware-supported
408 /* Pop the default_pvid of VLAN-unaware bridge ports from tagged frames.
413 /* Pop the default_pvid of VLAN-aware bridge ports from tagged frames.
416 * VLAN-tagged to the CPU, including those which were originally
422 * CPU, based on the software bridge database.
427 * should be retrieved from here and not from the per-port settings.
438 * to true to receive the bridge as an argument in .port_fdb_{add,del}
439 * and .port_mdb_{add,del}. Otherwise, the bridge.num will always be
502 /* Drivers that support bridge forwarding offload or FDB isolation
504 * switch tree (or all trees, in the case of cross-tree bridging
514 struct dsa_switch_tree *dst = ds->dst; in dsa_to_port()
515 struct dsa_port *dp; in dsa_to_port() local
517 list_for_each_entry(dp, &dst->ports, list) in dsa_to_port()
518 if (dp->ds == ds && dp->index == p) in dsa_to_port()
519 return dp; in dsa_to_port()
526 return port->type == DSA_PORT_TYPE_DSA; in dsa_port_is_dsa()
531 return port->type == DSA_PORT_TYPE_CPU; in dsa_port_is_cpu()
534 static inline bool dsa_port_is_user(struct dsa_port *dp) in dsa_port_is_user() argument
536 return dp->type == DSA_PORT_TYPE_USER; in dsa_port_is_user()
539 static inline bool dsa_port_is_unused(struct dsa_port *dp) in dsa_port_is_unused() argument
541 return dp->type == DSA_PORT_TYPE_UNUSED; in dsa_port_is_unused()
544 static inline bool dsa_port_conduit_is_operational(struct dsa_port *dp) in dsa_port_conduit_is_operational() argument
546 return dsa_port_is_cpu(dp) && dp->conduit_admin_up && in dsa_port_conduit_is_operational()
547 dp->conduit_oper_up; in dsa_port_conduit_is_operational()
552 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_UNUSED; in dsa_is_unused_port()
557 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_CPU; in dsa_is_cpu_port()
562 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_DSA; in dsa_is_dsa_port()
567 return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_USER; in dsa_is_user_port()
571 list_for_each_entry((_dp), &(_dst)->ports, list) \
575 list_for_each_entry_continue_reverse((_dp), &(_dst)->ports, list) \
579 list_for_each_entry((_dp), &(_dst)->ports, list) \
583 list_for_each_entry((_dp), &(_ds)->dst->ports, list) \
584 if ((_dp)->ds == (_ds))
587 list_for_each_entry_safe((_dp), (_next), &(_ds)->dst->ports, list) \
588 if ((_dp)->ds == (_ds))
591 list_for_each_entry_continue_reverse((_dp), &(_ds)->dst->ports, list) \
592 if ((_dp)->ds == (_ds))
616 struct dsa_port *dp; in dsa_user_ports() local
619 dsa_switch_for_each_user_port(dp, ds) in dsa_user_ports()
620 mask |= BIT(dp->index); in dsa_user_ports()
631 mask |= BIT(cpu_dp->index); in dsa_cpu_ports()
639 struct dsa_switch_tree *dst = ds->dst; in dsa_routing_port()
642 list_for_each_entry(dl, &dst->rtable, list) in dsa_routing_port()
643 if (dl->dp->ds == ds && dl->link_dp->ds->index == device) in dsa_routing_port()
644 return dl->dp->index; in dsa_routing_port()
646 return ds->num_ports; in dsa_routing_port()
653 if (device == ds->index) in dsa_towards_port()
662 const struct dsa_port *dp = dsa_to_port(ds, port); in dsa_upstream_port() local
663 const struct dsa_port *cpu_dp = dp->cpu_dp; in dsa_upstream_port()
668 return dsa_towards_port(ds, cpu_dp->ds->index, cpu_dp->index); in dsa_upstream_port()
689 struct dsa_port *dp; in dsa_switch_upstream_port() local
691 dsa_switch_for_each_available_port(dp, ds) { in dsa_switch_upstream_port()
692 return dsa_upstream_port(ds, dp->index); in dsa_switch_upstream_port()
695 return ds->num_ports; in dsa_switch_upstream_port()
710 routing_port = dsa_routing_port(downstream_ds, upstream_ds->index); in dsa_switch_is_upstream_of()
715 static inline bool dsa_port_is_vlan_filtering(const struct dsa_port *dp) in dsa_port_is_vlan_filtering() argument
717 const struct dsa_switch *ds = dp->ds; in dsa_port_is_vlan_filtering()
719 if (ds->vlan_filtering_is_global) in dsa_port_is_vlan_filtering()
720 return ds->vlan_filtering; in dsa_port_is_vlan_filtering()
722 return dp->vlan_filtering; in dsa_port_is_vlan_filtering()
725 static inline unsigned int dsa_port_lag_id_get(struct dsa_port *dp) in dsa_port_lag_id_get() argument
727 return dp->lag ? dp->lag->id : 0; in dsa_port_lag_id_get()
730 static inline struct net_device *dsa_port_lag_dev_get(struct dsa_port *dp) in dsa_port_lag_dev_get() argument
732 return dp->lag ? dp->lag->dev : NULL; in dsa_port_lag_dev_get()
735 static inline bool dsa_port_offloads_lag(struct dsa_port *dp, in dsa_port_offloads_lag() argument
738 return dsa_port_lag_dev_get(dp) == lag->dev; in dsa_port_offloads_lag()
741 static inline struct net_device *dsa_port_to_conduit(const struct dsa_port *dp) in dsa_port_to_conduit() argument
743 if (dp->cpu_port_in_lag) in dsa_port_to_conduit()
744 return dsa_port_lag_dev_get(dp->cpu_dp); in dsa_port_to_conduit()
746 return dp->cpu_dp->conduit; in dsa_port_to_conduit()
750 struct net_device *dsa_port_to_bridge_port(const struct dsa_port *dp) in dsa_port_to_bridge_port() argument
752 if (!dp->bridge) in dsa_port_to_bridge_port()
755 if (dp->lag) in dsa_port_to_bridge_port()
756 return dp->lag->dev; in dsa_port_to_bridge_port()
757 else if (dp->hsr_dev) in dsa_port_to_bridge_port()
758 return dp->hsr_dev; in dsa_port_to_bridge_port()
760 return dp->user; in dsa_port_to_bridge_port()
764 dsa_port_bridge_dev_get(const struct dsa_port *dp) in dsa_port_bridge_dev_get() argument
766 return dp->bridge ? dp->bridge->dev : NULL; in dsa_port_bridge_dev_get()
769 static inline unsigned int dsa_port_bridge_num_get(struct dsa_port *dp) in dsa_port_bridge_num_get() argument
771 return dp->bridge ? dp->bridge->num : 0; in dsa_port_bridge_num_get()
780 /* Standalone ports are not in the same bridge with one another */ in dsa_port_bridge_same()
784 static inline bool dsa_port_offloads_bridge_port(struct dsa_port *dp, in dsa_port_offloads_bridge_port() argument
787 return dsa_port_to_bridge_port(dp) == dev; in dsa_port_offloads_bridge_port()
791 dsa_port_offloads_bridge_dev(struct dsa_port *dp, in dsa_port_offloads_bridge_dev() argument
794 /* DSA ports connected to a bridge, and event was emitted in dsa_port_offloads_bridge_dev()
795 * for the bridge. in dsa_port_offloads_bridge_dev()
797 return dsa_port_bridge_dev_get(dp) == bridge_dev; in dsa_port_offloads_bridge_dev()
800 static inline bool dsa_port_offloads_bridge(struct dsa_port *dp, in dsa_port_offloads_bridge() argument
801 const struct dsa_bridge *bridge) in dsa_port_offloads_bridge() argument
803 return dsa_port_bridge_dev_get(dp) == bridge->dev; in dsa_port_offloads_bridge()
810 struct dsa_port *dp; in dsa_tree_offloads_bridge_port() local
812 list_for_each_entry(dp, &dst->ports, list) in dsa_tree_offloads_bridge_port()
813 if (dsa_port_offloads_bridge_port(dp, dev)) in dsa_tree_offloads_bridge_port()
819 /* Returns true if any port of this tree offloads the given bridge */
824 struct dsa_port *dp; in dsa_tree_offloads_bridge_dev() local
826 list_for_each_entry(dp, &dst->ports, list) in dsa_tree_offloads_bridge_dev()
827 if (dsa_port_offloads_bridge_dev(dp, bridge_dev)) in dsa_tree_offloads_bridge_dev()
836 return a->ds->dst == b->ds->dst; in dsa_port_tree_same()
866 /* Optional switch-wide initialization and destruction methods */
870 /* Per-port initialization and destruction methods. Mandatory if the
921 * ethtool Wake-on-LAN
1020 * Bridge integration
1024 struct dsa_bridge bridge,
1028 struct dsa_bridge bridge);
1055 int (*vlan_msti_set)(struct dsa_switch *ds, struct dsa_bridge bridge,
1114 * Cross-chip operations
1118 struct dsa_bridge bridge,
1122 struct dsa_bridge bridge);
1296 return dl_priv->ds; in dsa_devlink_to_ds()
1302 struct devlink *dl = port->devlink; in dsa_devlink_port_to_ds()
1305 return dl_priv->ds; in dsa_devlink_port_to_ds()
1310 return port->index; in dsa_devlink_port_to_port()
1329 return dev->dsa_ptr && dev->dsa_ptr->rcv; in netdev_uses_dsa()
1339 * - offset: the (B - A) difference between:
1341 * B. the current skb->data (aka ETH_HLEN bytes into the frame, aka 2 bytes
1346 * - proto: the value of the real EtherType.
1352 const struct dsa_device_ops *ops = skb->dev->dsa_ptr->tag_ops; in dsa_tag_generic_flow_dissect()
1353 int tag_len = ops->needed_headroom; in dsa_tag_generic_flow_dissect()
1356 *proto = ((__be16 *)skb->data)[(tag_len / 2) - 1]; in dsa_tag_generic_flow_dissect()