net: dsa: Allow the DSA driver to indicate the tag protocol
authorAndrew Lunn <andrew@lunn.ch>
Mon, 22 Aug 2016 14:01:01 +0000 (16:01 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 23 Aug 2016 04:08:08 +0000 (21:08 -0700)
DSA drivers may drive different families of switches which need
different tag protocol. Rather than hard code the tag protocol in the
driver structure, have a callback for the DSA core to call.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/b53/b53_common.c
drivers/net/dsa/bcm_sf2.c
drivers/net/dsa/mv88e6060.c
drivers/net/dsa/mv88e6xxx/chip.c
include/net/dsa.h
net/dsa/dsa.c
net/dsa/dsa2.c

index 38ee10d..65ecb51 100644 (file)
@@ -1373,8 +1373,13 @@ static void b53_br_set_stp_state(struct dsa_switch *ds, int port,
        b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(port), reg);
 }
 
+static enum dsa_tag_protocol b53_get_tag_protocol(struct dsa_switch *ds)
+{
+       return DSA_TAG_PROTO_NONE;
+}
+
 static struct dsa_switch_driver b53_switch_ops = {
-       .tag_protocol           = DSA_TAG_PROTO_NONE,
+       .get_tag_protocol       = b53_get_tag_protocol,
        .setup                  = b53_setup,
        .set_addr               = b53_set_addr,
        .get_strings            = b53_get_strings,
index 8e6fe13..b47a74b 100644 (file)
@@ -136,6 +136,11 @@ static int bcm_sf2_sw_get_sset_count(struct dsa_switch *ds)
        return BCM_SF2_STATS_SIZE;
 }
 
+static enum dsa_tag_protocol bcm_sf2_sw_get_tag_protocol(struct dsa_switch *ds)
+{
+       return DSA_TAG_PROTO_BRCM;
+}
+
 static void bcm_sf2_imp_vlan_setup(struct dsa_switch *ds, int cpu_port)
 {
        struct bcm_sf2_priv *priv = ds_to_priv(ds);
@@ -1577,8 +1582,8 @@ static int bcm_sf2_sw_setup(struct dsa_switch *ds)
 }
 
 static struct dsa_switch_driver bcm_sf2_switch_driver = {
-       .tag_protocol           = DSA_TAG_PROTO_BRCM,
        .setup                  = bcm_sf2_sw_setup,
+       .get_tag_protocol       = bcm_sf2_sw_get_tag_protocol,
        .set_addr               = bcm_sf2_sw_set_addr,
        .get_phy_flags          = bcm_sf2_sw_get_phy_flags,
        .get_strings            = bcm_sf2_sw_get_strings,
index e36b408..1fdfbf3 100644 (file)
@@ -69,6 +69,11 @@ static const char *mv88e6060_get_name(struct mii_bus *bus, int sw_addr)
        return NULL;
 }
 
+static enum dsa_tag_protocol mv88e6060_get_tag_protocol(struct dsa_switch *ds)
+{
+       return DSA_TAG_PROTO_TRAILER;
+}
+
 static const char *mv88e6060_drv_probe(struct device *dsa_dev,
                                       struct device *host_dev, int sw_addr,
                                       void **_priv)
@@ -248,7 +253,7 @@ mv88e6060_phy_write(struct dsa_switch *ds, int port, int regnum, u16 val)
 }
 
 static struct dsa_switch_driver mv88e6060_switch_driver = {
-       .tag_protocol   = DSA_TAG_PROTO_TRAILER,
+       .get_tag_protocol = mv88e6060_get_tag_protocol,
        .probe          = mv88e6060_drv_probe,
        .setup          = mv88e6060_setup,
        .set_addr       = mv88e6060_set_addr,
index 014b52b..63cad6c 100644 (file)
@@ -3924,6 +3924,11 @@ static int mv88e6xxx_smi_init(struct mv88e6xxx_chip *chip,
        return 0;
 }
 
+static enum dsa_tag_protocol mv88e6xxx_get_tag_protocol(struct dsa_switch *ds)
+{
+       return DSA_TAG_PROTO_EDSA;
+}
+
 static const char *mv88e6xxx_drv_probe(struct device *dsa_dev,
                                       struct device *host_dev, int sw_addr,
                                       void **priv)
@@ -3967,8 +3972,8 @@ free:
 }
 
 static struct dsa_switch_driver mv88e6xxx_switch_driver = {
-       .tag_protocol           = DSA_TAG_PROTO_EDSA,
        .probe                  = mv88e6xxx_drv_probe,
+       .get_tag_protocol       = mv88e6xxx_get_tag_protocol,
        .setup                  = mv88e6xxx_setup,
        .set_addr               = mv88e6xxx_set_addr,
        .adjust_link            = mv88e6xxx_adjust_link,
index d00c392..8ca2684 100644 (file)
@@ -239,14 +239,15 @@ struct switchdev_obj_port_vlan;
 struct dsa_switch_driver {
        struct list_head        list;
 
-       enum dsa_tag_protocol   tag_protocol;
-
        /*
         * Probing and setup.
         */
        const char      *(*probe)(struct device *dsa_dev,
                                  struct device *host_dev, int sw_addr,
                                  void **priv);
+
+       enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *ds);
+
        int     (*setup)(struct dsa_switch *ds);
        int     (*set_addr)(struct dsa_switch *ds, u8 *addr);
        u32     (*get_phy_flags)(struct dsa_switch *ds, int port);
index 8bda74e..8d3a28d 100644 (file)
@@ -354,7 +354,10 @@ static int dsa_switch_setup_one(struct dsa_switch *ds, struct device *parent)
         * switch.
         */
        if (dst->cpu_switch == index) {
-               dst->tag_ops = dsa_resolve_tag_protocol(drv->tag_protocol);
+               enum dsa_tag_protocol tag_protocol;
+
+               tag_protocol = drv->get_tag_protocol(ds);
+               dst->tag_ops = dsa_resolve_tag_protocol(tag_protocol);
                if (IS_ERR(dst->tag_ops)) {
                        ret = PTR_ERR(dst->tag_ops);
                        goto out;
index f30bad9..2e34322 100644 (file)
@@ -443,6 +443,7 @@ static int dsa_cpu_parse(struct device_node *port, u32 index,
                         struct dsa_switch_tree *dst,
                         struct dsa_switch *ds)
 {
+       enum dsa_tag_protocol tag_protocol;
        struct net_device *ethernet_dev;
        struct device_node *ethernet;
 
@@ -465,7 +466,8 @@ static int dsa_cpu_parse(struct device_node *port, u32 index,
                dst->cpu_port = index;
        }
 
-       dst->tag_ops = dsa_resolve_tag_protocol(ds->drv->tag_protocol);
+       tag_protocol = ds->drv->get_tag_protocol(ds);
+       dst->tag_ops = dsa_resolve_tag_protocol(tag_protocol);
        if (IS_ERR(dst->tag_ops)) {
                dev_warn(ds->dev, "No tagger for this switch\n");
                return PTR_ERR(dst->tag_ops);