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: Simon Arlott <simon@fire.lp0.eu> Cc: Duncan Sands <duncan.sands@math.u-psud.fr> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
c2cf3f6ec5
commit
e9b8daf31b
@ -968,6 +968,14 @@ static int usbatm_atm_init(struct usbatm_data *instance)
|
|||||||
/* temp init ATM device, set to 128kbit */
|
/* temp init ATM device, set to 128kbit */
|
||||||
atm_dev->link_rate = 128 * 1000 / 424;
|
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)) {
|
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);
|
atm_err(instance, "%s: atm_start failed: %d!\n", __func__, ret);
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -986,6 +994,8 @@ static int usbatm_atm_init(struct usbatm_data *instance)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
sysfs_remove_link(&atm_dev->class_dev.kobj, "device");
|
||||||
|
fail_sysfs:
|
||||||
instance->atm_dev = NULL;
|
instance->atm_dev = NULL;
|
||||||
atm_dev_deregister(atm_dev); /* usbatm_atm_dev_close will eventually be called */
|
atm_dev_deregister(atm_dev); /* usbatm_atm_dev_close will eventually be called */
|
||||||
return ret;
|
return ret;
|
||||||
@ -1318,8 +1328,10 @@ void usbatm_usb_disconnect(struct usb_interface *intf)
|
|||||||
kfree(instance->cell_buf);
|
kfree(instance->cell_buf);
|
||||||
|
|
||||||
/* ATM finalize */
|
/* 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);
|
atm_dev_deregister(instance->atm_dev);
|
||||||
|
}
|
||||||
|
|
||||||
usbatm_put_instance(instance); /* taken in usbatm_usb_probe */
|
usbatm_put_instance(instance); /* taken in usbatm_usb_probe */
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user