aboutsummaryrefslogtreecommitdiff
path: root/include/net/dsa.h
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2017-10-28 00:00:10 +0900
committerDavid S. Miller <davem@davemloft.net>2017-10-28 00:00:10 +0900
commite324615b47fba404f28c709ee0db02d75829ce43 (patch)
treead4d849b5d26b0745930361f7d22f2f47e66b205 /include/net/dsa.h
parent5bca178eed601cd4584c38c5290f7abbcacf3fb3 (diff)
parent5749f0f3772b9d98f37e3a92539f49fafaa64eca (diff)
Merge branch 'dsa-define-port-types'
Vivien Didelot says: ==================== net: dsa: define port types The DSA code currently has 3 bitmaps in the dsa_switch structure: cpu_port_mask, dsa_port_mask and enabled_port_mask. They are used to store the type of each switch port. This dates back from when DSA didn't have a dsa_port structure to hold port-specific data. The dsa_switch structure is mainly used to communicate with DSA drivers and must not contain such static data parsed from DTS or pdata, which belongs the DSA core structures, such as dsa_switch_tree and dsa_port. Also the enabled_port_mask is misleading, often misinterpreted as the complement of disabled ports (thus including DSA and CPU ports), while in fact it only masks the user ports. A port can be of 3 types when it is not unused: "cpu" (interfacing with a master device), "dsa" (interconnecting with another "dsa" port from another switch chip), or "user" (user-facing port.) This patchset first fixes the usage of DSA port type helpers, then defines the DSA_PORT_TYPE_UNUSED, DSA_PORT_TYPE_CPU, DSA_PORT_TYPE_DSA, and DSA_PORT_TYPE_USER port types, and finally removes the misleading port bitmaps. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/dsa.h')
-rw-r--r--include/net/dsa.h39
1 files changed, 30 insertions, 9 deletions
diff --git a/include/net/dsa.h b/include/net/dsa.h
index 38961ef91d3d..50e276dc4c01 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -180,6 +180,13 @@ struct dsa_port {
struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
struct packet_type *pt);
+ enum {
+ DSA_PORT_TYPE_UNUSED = 0,
+ DSA_PORT_TYPE_CPU,
+ DSA_PORT_TYPE_DSA,
+ DSA_PORT_TYPE_USER,
+ } type;
+
struct dsa_switch *ds;
unsigned int index;
const char *name;
@@ -233,9 +240,6 @@ struct dsa_switch {
/*
* Slave mii_bus and devices for the individual ports.
*/
- u32 dsa_port_mask;
- u32 cpu_port_mask;
- u32 enabled_port_mask;
u32 phys_mii_mask;
struct mii_bus *slave_mii_bus;
@@ -254,24 +258,41 @@ struct dsa_switch {
struct dsa_port ports[];
};
+static inline const struct dsa_port *dsa_to_port(struct dsa_switch *ds, int p)
+{
+ return &ds->ports[p];
+}
+
+static inline bool dsa_is_unused_port(struct dsa_switch *ds, int p)
+{
+ return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_UNUSED;
+}
+
static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
{
- return !!(ds->cpu_port_mask & (1 << p));
+ return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_CPU;
}
static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)
{
- return !!((ds->dsa_port_mask) & (1 << p));
+ return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_DSA;
}
-static inline bool dsa_is_normal_port(struct dsa_switch *ds, int p)
+static inline bool dsa_is_user_port(struct dsa_switch *ds, int p)
{
- return !dsa_is_cpu_port(ds, p) && !dsa_is_dsa_port(ds, p);
+ return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_USER;
}
-static inline const struct dsa_port *dsa_to_port(struct dsa_switch *ds, int p)
+static inline u32 dsa_user_ports(struct dsa_switch *ds)
{
- return &ds->ports[p];
+ u32 mask = 0;
+ int p;
+
+ for (p = 0; p < ds->num_ports; p++)
+ if (dsa_is_user_port(ds, p))
+ mask |= BIT(p);
+
+ return mask;
}
static inline u8 dsa_upstream_port(struct dsa_switch *ds)