Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e9b8daf3 authored by Simon Arlott's avatar Simon Arlott Committed by Greg Kroah-Hartman
Browse files

usbatm: create sysfs link "device" from atm class device to usb interface

There is currently no path from the ATM device in /sys to the USB device's
interface that the driver is using; this patch creates a "device" symlink.  It
is then possible to get to the cxacru ADSL statistics
(http://lkml.org/lkml/2007/2/23/328

):

/sys/class/atm/cxacru0/device $ ls *_rate *_margin *_attenuation
downstream_attenuation  downstream_snr_margin  upstream_rate
downstream_rate         upstream_attenuation   upstream_snr_margin

If this link is not appropriate I'd have to create device files in
/sys/class/atm/cxacru0 instead - which seems less appropriate since the ADSL
statistics are for the USB device not ATM (which is running over the ADSL).

[akpm@linux-foundation.org: cleanups]
Signed-off-by: default avatarSimon Arlott <simon@fire.lp0.eu>
Cc: Duncan Sands <duncan.sands@math.u-psud.fr>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent c2cf3f6e
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -968,6 +968,14 @@ static int usbatm_atm_init(struct usbatm_data *instance)
	/* temp init ATM device, set to 128kbit */
	atm_dev->link_rate = 128 * 1000 / 424;

	ret = sysfs_create_link(&atm_dev->class_dev.kobj,
				&instance->usb_intf->dev.kobj, "device");
	if (ret) {
		atm_err(instance, "%s: sysfs_create_link failed: %d\n",
					__func__, ret);
		goto fail_sysfs;
	}

	if (instance->driver->atm_start && ((ret = instance->driver->atm_start(instance, atm_dev)) < 0)) {
		atm_err(instance, "%s: atm_start failed: %d!\n", __func__, ret);
		goto fail;
@@ -986,6 +994,8 @@ static int usbatm_atm_init(struct usbatm_data *instance)
	return 0;

 fail:
	sysfs_remove_link(&atm_dev->class_dev.kobj, "device");
 fail_sysfs:
	instance->atm_dev = NULL;
	atm_dev_deregister(atm_dev); /* usbatm_atm_dev_close will eventually be called */
	return ret;
@@ -1318,8 +1328,10 @@ void usbatm_usb_disconnect(struct usb_interface *intf)
	kfree(instance->cell_buf);

	/* ATM finalize */
	if (instance->atm_dev)
	if (instance->atm_dev) {
		sysfs_remove_link(&instance->atm_dev->class_dev.kobj, "device");
		atm_dev_deregister(instance->atm_dev);
	}

	usbatm_put_instance(instance);	/* taken in usbatm_usb_probe */
}