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 38ee10de78844c8462062a59f0ed7ec3d4c2d075..65ecb51f99e5a0694d351cba9b70a453741414f6 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 8e6fe13dbec396b831ea0e0433539fe508301e66..b47a74b37a42769461c2673ff8f8a59e4d5ee8a0 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 e36b40886bd810c0c517b8ac3f2e320d9581ed9a..1fdfbf3a50bc6ec1764193bb51ef948d02befbba 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 014b52bd72f123776dcf69f4e1a5f639b90c9202..63cad6c00bc775693a206a2f1a475fd589901ec2 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 d00c392bc9f880adfb5f9b281ea80de79cb0beb8..8ca2684c53584e4db71198eba7cc79bc560e9ce8 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 8bda74e595a54b7ad6e27c9342cc484a60ba95e1..8d3a28d4e99ddda19d1238e70ccf6b34e8c4d3dd 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 f30bad9678f0da0b2e49a0fe828befbc3daf72fa..2e343221464c41199561674fdf5a63b5c074bd83 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);