Commit 53928cdd authored by David S. Miller's avatar David S. Miller

Merge branch 'dsa-cleanups'

Vladimir Oltean says:

====================
Cleanup to main DSA structures

This series contains changes that do the following:

- struct dsa_port reduced from 576 to 544 bytes, and first cache line a
  bit better organized
- struct dsa_switch from 160 to 136 bytes, and first cache line a bit
  better organized
- struct dsa_switch_tree from 112 to 104 bytes, and first cache line a
  bit better organized
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 5be9963d 4b026e82
...@@ -119,6 +119,9 @@ struct dsa_netdevice_ops { ...@@ -119,6 +119,9 @@ struct dsa_netdevice_ops {
struct dsa_switch_tree { struct dsa_switch_tree {
struct list_head list; struct list_head list;
/* List of switch ports */
struct list_head ports;
/* Notifier chain for switch-wide events */ /* Notifier chain for switch-wide events */
struct raw_notifier_head nh; struct raw_notifier_head nh;
...@@ -128,8 +131,10 @@ struct dsa_switch_tree { ...@@ -128,8 +131,10 @@ struct dsa_switch_tree {
/* Number of switches attached to this tree */ /* Number of switches attached to this tree */
struct kref refcount; struct kref refcount;
/* Has this tree been applied to the hardware? */ /* Maps offloaded LAG netdevs to a zero-based linear ID for
bool setup; * drivers that need it.
*/
struct net_device **lags;
/* Tagging protocol operations */ /* Tagging protocol operations */
const struct dsa_device_ops *tag_ops; const struct dsa_device_ops *tag_ops;
...@@ -139,22 +144,19 @@ struct dsa_switch_tree { ...@@ -139,22 +144,19 @@ struct dsa_switch_tree {
*/ */
enum dsa_tag_protocol default_proto; enum dsa_tag_protocol default_proto;
/* Has this tree been applied to the hardware? */
bool setup;
/* /*
* Configuration data for the platform device that owns * Configuration data for the platform device that owns
* this dsa switch tree instance. * this dsa switch tree instance.
*/ */
struct dsa_platform_data *pd; struct dsa_platform_data *pd;
/* List of switch ports */
struct list_head ports;
/* List of DSA links composing the routing table */ /* List of DSA links composing the routing table */
struct list_head rtable; struct list_head rtable;
/* Maps offloaded LAG netdevs to a zero-based linear ID for /* Length of "lags" array */
* drivers that need it.
*/
struct net_device **lags;
unsigned int lags_len; unsigned int lags_len;
/* Track the largest switch index within a tree */ /* Track the largest switch index within a tree */
...@@ -246,6 +248,10 @@ struct dsa_port { ...@@ -246,6 +248,10 @@ struct dsa_port {
struct dsa_switch_tree *dst; struct dsa_switch_tree *dst;
struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev); struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev);
struct dsa_switch *ds;
unsigned int index;
enum { enum {
DSA_PORT_TYPE_UNUSED = 0, DSA_PORT_TYPE_UNUSED = 0,
DSA_PORT_TYPE_CPU, DSA_PORT_TYPE_CPU,
...@@ -253,24 +259,29 @@ struct dsa_port { ...@@ -253,24 +259,29 @@ struct dsa_port {
DSA_PORT_TYPE_USER, DSA_PORT_TYPE_USER,
} type; } type;
struct dsa_switch *ds;
unsigned int index;
const char *name; const char *name;
struct dsa_port *cpu_dp; struct dsa_port *cpu_dp;
u8 mac[ETH_ALEN]; u8 mac[ETH_ALEN];
u8 stp_state;
u8 vlan_filtering:1,
/* Managed by DSA on user ports and by
* drivers on CPU and DSA ports
*/
learning:1,
lag_tx_enabled:1,
devlink_port_setup:1,
setup:1;
struct device_node *dn; struct device_node *dn;
unsigned int ageing_time; unsigned int ageing_time;
bool vlan_filtering;
/* Managed by DSA on user ports and by drivers on CPU and DSA ports */
bool learning;
u8 stp_state;
struct dsa_bridge *bridge; struct dsa_bridge *bridge;
struct devlink_port devlink_port; struct devlink_port devlink_port;
bool devlink_port_setup;
struct phylink *pl; struct phylink *pl;
struct phylink_config pl_config; struct phylink_config pl_config;
struct net_device *lag_dev; struct net_device *lag_dev;
bool lag_tx_enabled;
struct net_device *hsr_dev; struct net_device *hsr_dev;
struct list_head list; struct list_head list;
...@@ -291,8 +302,6 @@ struct dsa_port { ...@@ -291,8 +302,6 @@ struct dsa_port {
struct mutex addr_lists_lock; struct mutex addr_lists_lock;
struct list_head fdbs; struct list_head fdbs;
struct list_head mdbs; struct list_head mdbs;
bool setup;
}; };
/* TODO: ideally DSA ports would have a single dp->link_dp member, /* TODO: ideally DSA ports would have a single dp->link_dp member,
...@@ -314,8 +323,6 @@ struct dsa_mac_addr { ...@@ -314,8 +323,6 @@ struct dsa_mac_addr {
}; };
struct dsa_switch { struct dsa_switch {
bool setup;
struct device *dev; struct device *dev;
/* /*
...@@ -324,6 +331,57 @@ struct dsa_switch { ...@@ -324,6 +331,57 @@ struct dsa_switch {
struct dsa_switch_tree *dst; struct dsa_switch_tree *dst;
unsigned int index; unsigned int index;
u32 setup:1,
/* Disallow bridge core from requesting
* different VLAN awareness settings on ports
* if not hardware-supported
*/
vlan_filtering_is_global:1,
/* Keep VLAN filtering enabled on ports not
* offloading any upper
*/
needs_standalone_vlan_filtering:1,
/* Pass .port_vlan_add and .port_vlan_del to
* drivers even for bridges that have
* vlan_filtering=0. All drivers should ideally
* set this (and then the option would get
* removed), but it is unknown whether this
* would break things or not.
*/
configure_vlan_while_not_filtering:1,
/* If the switch driver always programs the CPU
* port as egress tagged despite the VLAN
* configuration indicating otherwise, then
* setting @untag_bridge_pvid will force the
* DSA receive path to pop the bridge's
* default_pvid VLAN tagged frames to offer a
* consistent behavior between a
* vlan_filtering=0 and vlan_filtering=1 bridge
* device.
*/
untag_bridge_pvid:1,
/* Let DSA manage the FDB entries towards the
* CPU, based on the software bridge database.
*/
assisted_learning_on_cpu_port:1,
/* In case vlan_filtering_is_global is set, the
* VLAN awareness state should be retrieved
* from here and not from the per-port
* settings.
*/
vlan_filtering:1,
/* MAC PCS does not provide link state change
* interrupt, and requires polling. Flag passed
* on to PHYLINK.
*/
pcs_poll:1,
/* For switches that only have the MRU
* configurable. To ensure the configured MTU
* is not exceeded, normalization of MRU on all
* bridged interfaces is needed.
*/
mtu_enforcement_ingress:1;
/* Listener for switch fabric events */ /* Listener for switch fabric events */
struct notifier_block nb; struct notifier_block nb;
...@@ -364,50 +422,6 @@ struct dsa_switch { ...@@ -364,50 +422,6 @@ struct dsa_switch {
/* Number of switch port queues */ /* Number of switch port queues */
unsigned int num_tx_queues; unsigned int num_tx_queues;
/* Disallow bridge core from requesting different VLAN awareness
* settings on ports if not hardware-supported
*/
bool vlan_filtering_is_global;
/* Keep VLAN filtering enabled on ports not offloading any upper. */
bool needs_standalone_vlan_filtering;
/* Pass .port_vlan_add and .port_vlan_del to drivers even for bridges
* that have vlan_filtering=0. All drivers should ideally set this (and
* then the option would get removed), but it is unknown whether this
* would break things or not.
*/
bool configure_vlan_while_not_filtering;
/* If the switch driver always programs the CPU port as egress tagged
* despite the VLAN configuration indicating otherwise, then setting
* @untag_bridge_pvid will force the DSA receive path to pop the bridge's
* default_pvid VLAN tagged frames to offer a consistent behavior
* between a vlan_filtering=0 and vlan_filtering=1 bridge device.
*/
bool untag_bridge_pvid;
/* Let DSA manage the FDB entries towards the CPU, based on the
* software bridge database.
*/
bool assisted_learning_on_cpu_port;
/* In case vlan_filtering_is_global is set, the VLAN awareness state
* should be retrieved from here and not from the per-port settings.
*/
bool vlan_filtering;
/* MAC PCS does not provide link state change interrupt, and requires
* polling. Flag passed on to PHYLINK.
*/
bool pcs_poll;
/* For switches that only have the MRU configurable. To ensure the
* configured MTU is not exceeded, normalization of MRU on all bridged
* interfaces is needed.
*/
bool mtu_enforcement_ingress;
/* Drivers that benefit from having an ID associated with each /* Drivers that benefit from having an ID associated with each
* offloaded LAG should set this to the maximum number of * offloaded LAG should set this to the maximum number of
* supported IDs. DSA will then maintain a mapping of _at * supported IDs. DSA will then maintain a mapping of _at
...@@ -423,7 +437,7 @@ struct dsa_switch { ...@@ -423,7 +437,7 @@ struct dsa_switch {
*/ */
unsigned int max_num_bridges; unsigned int max_num_bridges;
size_t num_ports; unsigned int num_ports;
}; };
static inline struct dsa_port *dsa_to_port(struct dsa_switch *ds, int p) static inline struct dsa_port *dsa_to_port(struct dsa_switch *ds, int p)
......
...@@ -1440,7 +1440,7 @@ static int dsa_switch_parse_ports_of(struct dsa_switch *ds, ...@@ -1440,7 +1440,7 @@ static int dsa_switch_parse_ports_of(struct dsa_switch *ds,
} }
if (reg >= ds->num_ports) { if (reg >= ds->num_ports) {
dev_err(ds->dev, "port %pOF index %u exceeds num_ports (%zu)\n", dev_err(ds->dev, "port %pOF index %u exceeds num_ports (%u)\n",
port, reg, ds->num_ports); port, reg, ds->num_ports);
of_node_put(port); of_node_put(port);
err = -EINVAL; err = -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment