net: dsa: Hook {get,set}_rxnfc ethtool operations
authorFlorian Fainelli <f.fainelli@gmail.com>
Mon, 30 Jan 2017 17:48:40 +0000 (09:48 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 Jan 2017 19:49:57 +0000 (14:49 -0500)
In preparation for adding support for CFP/TCAMP in the bcm_sf2 driver add the
plumbing to call into driver specific {get,set}_rxnfc operations.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dsa.h
net/dsa/slave.c

index b951e2ebda75598ac70ba9a91687e24157ebf7d6..d5d618c3de640d0d75f0445eb609e92eb788c009 100644 (file)
@@ -377,6 +377,14 @@ struct dsa_switch_ops {
        int     (*port_mdb_dump)(struct dsa_switch *ds, int port,
                                 struct switchdev_obj_port_mdb *mdb,
                                 int (*cb)(struct switchdev_obj *obj));
+
+       /*
+        * RXNFC
+        */
+       int     (*get_rxnfc)(struct dsa_switch *ds, int port,
+                            struct ethtool_rxnfc *nfc, u32 *rule_locs);
+       int     (*set_rxnfc)(struct dsa_switch *ds, int port,
+                            struct ethtool_rxnfc *nfc);
 };
 
 struct dsa_switch_driver {
index 08725286f79dd05b01490fdab74ca0fccc624048..6881889e1a9bc3ef6a02d7dc3086a370522ff03b 100644 (file)
@@ -1002,6 +1002,30 @@ void dsa_cpu_port_ethtool_init(struct ethtool_ops *ops)
        ops->get_strings = dsa_cpu_port_get_strings;
 }
 
+static int dsa_slave_get_rxnfc(struct net_device *dev,
+                              struct ethtool_rxnfc *nfc, u32 *rule_locs)
+{
+       struct dsa_slave_priv *p = netdev_priv(dev);
+       struct dsa_switch *ds = p->dp->ds;
+
+       if (!ds->ops->get_rxnfc)
+               return -EOPNOTSUPP;
+
+       return ds->ops->get_rxnfc(ds, p->dp->index, nfc, rule_locs);
+}
+
+static int dsa_slave_set_rxnfc(struct net_device *dev,
+                              struct ethtool_rxnfc *nfc)
+{
+       struct dsa_slave_priv *p = netdev_priv(dev);
+       struct dsa_switch *ds = p->dp->ds;
+
+       if (!ds->ops->set_rxnfc)
+               return -EOPNOTSUPP;
+
+       return ds->ops->set_rxnfc(ds, p->dp->index, nfc);
+}
+
 static const struct ethtool_ops dsa_slave_ethtool_ops = {
        .get_drvinfo            = dsa_slave_get_drvinfo,
        .get_regs_len           = dsa_slave_get_regs_len,
@@ -1020,6 +1044,8 @@ static const struct ethtool_ops dsa_slave_ethtool_ops = {
        .get_eee                = dsa_slave_get_eee,
        .get_link_ksettings     = dsa_slave_get_link_ksettings,
        .set_link_ksettings     = dsa_slave_set_link_ksettings,
+       .get_rxnfc              = dsa_slave_get_rxnfc,
+       .set_rxnfc              = dsa_slave_set_rxnfc,
 };
 
 static const struct net_device_ops dsa_slave_netdev_ops = {