|
@@ -158,8 +158,31 @@ static void dsa_master_ethtool_teardown(struct net_device *dev)
|
|
|
cpu_dp->orig_ethtool_ops = NULL;
|
|
|
}
|
|
|
|
|
|
+static ssize_t tagging_show(struct device *d, struct device_attribute *attr,
|
|
|
+ char *buf)
|
|
|
+{
|
|
|
+ struct net_device *dev = to_net_dev(d);
|
|
|
+ struct dsa_port *cpu_dp = dev->dsa_ptr;
|
|
|
+
|
|
|
+ return sprintf(buf, "%s\n",
|
|
|
+ dsa_tag_protocol_to_str(cpu_dp->tag_ops));
|
|
|
+}
|
|
|
+static DEVICE_ATTR_RO(tagging);
|
|
|
+
|
|
|
+static struct attribute *dsa_slave_attrs[] = {
|
|
|
+ &dev_attr_tagging.attr,
|
|
|
+ NULL
|
|
|
+};
|
|
|
+
|
|
|
+static const struct attribute_group dsa_group = {
|
|
|
+ .name = "dsa",
|
|
|
+ .attrs = dsa_slave_attrs,
|
|
|
+};
|
|
|
+
|
|
|
int dsa_master_setup(struct net_device *dev, struct dsa_port *cpu_dp)
|
|
|
{
|
|
|
+ int ret;
|
|
|
+
|
|
|
/* If we use a tagging format that doesn't have an ethertype
|
|
|
* field, make sure that all packets from this point on get
|
|
|
* sent to the tag format's receive function.
|
|
@@ -168,11 +191,20 @@ int dsa_master_setup(struct net_device *dev, struct dsa_port *cpu_dp)
|
|
|
|
|
|
dev->dsa_ptr = cpu_dp;
|
|
|
|
|
|
- return dsa_master_ethtool_setup(dev);
|
|
|
+ ret = dsa_master_ethtool_setup(dev);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = sysfs_create_group(&dev->dev.kobj, &dsa_group);
|
|
|
+ if (ret)
|
|
|
+ dsa_master_ethtool_teardown(dev);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
void dsa_master_teardown(struct net_device *dev)
|
|
|
{
|
|
|
+ sysfs_remove_group(&dev->dev.kobj, &dsa_group);
|
|
|
dsa_master_ethtool_teardown(dev);
|
|
|
|
|
|
dev->dsa_ptr = NULL;
|