This patch exports the user device ID as a sysfs attribute. This allows users to easily read the ID and to write udev rules that can match against the ID. Signed-off-by: Lukas Magel <lukas.magel@xxxxxxxxxx> Signed-off-by: Stephane Grosjean <s.grosjean@xxxxxxxxxxxxxxx> --- .../ABI/testing/sysfs-class-net-peak_usb | 15 ++++++++++ drivers/net/can/usb/peak_usb/pcan_usb_core.c | 30 +++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-class-net-peak_usb diff --git a/Documentation/ABI/testing/sysfs-class-net-peak_usb b/Documentation/ABI/testing/sysfs-class-net-peak_usb new file mode 100644 index 000000000000..f7f23f9bdfde --- /dev/null +++ b/Documentation/ABI/testing/sysfs-class-net-peak_usb @@ -0,0 +1,15 @@ + +What: /sys/class/net/<iface>/peak_usb/user_devid +Date: October 2022 +KernelVersion: 6.1 +Contact: Stephane Grosjean <s.grosjean@xxxxxxxxxxxxxxx> +Description: + PEAK PCAN-USB devices support a user-configurable device + identifier. This attribute provides read-only access to the + currently configured value of the device identifier. Depending + on the device type, the identifier has a length of 8 or 32 bit. + The value read from this attribute is always an 8 digit 32 bit + hexadecimal value in big endian format. If the device only + supports an 8 bit identifier, the upper 24 bit of the value are + set to zero. + diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.c b/drivers/net/can/usb/peak_usb/pcan_usb_core.c index 438788732c2c..fbefd4f05e08 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_core.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.c @@ -8,13 +8,15 @@ * * Many thanks to Klaus Hitschler <klaus.hitschler@xxxxxx> */ +#include <linux/device.h> +#include <linux/ethtool.h> #include <linux/init.h> -#include <linux/signal.h> -#include <linux/slab.h> #include <linux/module.h> #include <linux/netdevice.h> +#include <linux/signal.h> +#include <linux/slab.h> +#include <linux/sysfs.h> #include <linux/usb.h> -#include <linux/ethtool.h> #include <linux/can.h> #include <linux/can/dev.h> @@ -53,6 +55,25 @@ static const struct usb_device_id peak_usb_table[] = { MODULE_DEVICE_TABLE(usb, peak_usb_table); +static ssize_t user_devid_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct net_device *netdev = to_net_dev(dev); + struct peak_usb_device *peak_dev = netdev_priv(netdev); + + return sysfs_emit(buf, "%08X\n", peak_dev->user_devid); +} +static DEVICE_ATTR_RO(user_devid); + +static const struct attribute *peak_usb_sysfs_attrs[] = { + &dev_attr_user_devid.attr, + NULL, +}; + +static const struct attribute_group peak_usb_sysfs_group = { + .name = "peak_usb", + .attrs = (struct attribute **)peak_usb_sysfs_attrs, +}; + /* * dump memory */ @@ -961,6 +982,9 @@ static int peak_usb_create_dev(const struct peak_usb_adapter *peak_usb_adapter, /* add ethtool support */ netdev->ethtool_ops = peak_usb_adapter->ethtool_ops; + /* register peak_usb sysfs files */ + netdev->sysfs_groups[0] = &peak_usb_sysfs_group; + init_usb_anchor(&dev->rx_submitted); init_usb_anchor(&dev->tx_submitted); -- 2.37.2