diff options
Diffstat (limited to 'net/dsa/master.c')
| -rw-r--r-- | net/dsa/master.c | 34 | 
1 files changed, 33 insertions, 1 deletions
diff --git a/net/dsa/master.c b/net/dsa/master.c index c90ee3227dea..5e8c9bef78bd 100644 --- a/net/dsa/master.c +++ b/net/dsa/master.c @@ -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;  | 
