summaryrefslogtreecommitdiffstats
path: root/drivers/uwb
diff options
context:
space:
mode:
authorThomas Pugliese <thomas.pugliese@gmail.com>2013-08-08 10:38:23 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-08-12 18:41:09 -0400
commitfbbde074abf41efddbb5daeb1690d7281d613a8e (patch)
tree7c120c8d83f0eb85eab96b858aaafa7c63d7d8f2 /drivers/uwb
parent644f6a121af0aee94b243d33cfe38d6d474e8cbc (diff)
UWB: fix sysfs warning on HWA device unplug.
In the disconnect routine for the hwa_hc interface, it calls uwb_pal_unregister to unregister itself from the UWB subsystem. This function attempts to clean up the link to the host controller directory in the device's UWB radio control interface directory. If the disconnect routine for the radio control interface has already run, the uwb directory will be gone so the call to sysfs_remove_link generates a warning. Signed-off-by: Thomas Pugliese <thomas.pugliese@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/uwb')
-rw-r--r--drivers/uwb/pal.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/drivers/uwb/pal.c b/drivers/uwb/pal.c
index 690577d2a35b..c1304b8d4985 100644
--- a/drivers/uwb/pal.c
+++ b/drivers/uwb/pal.c
@@ -68,8 +68,40 @@ int uwb_pal_register(struct uwb_pal *pal)
68} 68}
69EXPORT_SYMBOL_GPL(uwb_pal_register); 69EXPORT_SYMBOL_GPL(uwb_pal_register);
70 70
71static int find_rc(struct device *dev, const void *data)
72{
73 const struct uwb_rc *target_rc = data;
74 struct uwb_rc *rc = dev_get_drvdata(dev);
75
76 if (rc == NULL) {
77 WARN_ON(1);
78 return 0;
79 }
80 if (rc == target_rc) {
81 if (rc->ready == 0)
82 return 0;
83 else
84 return 1;
85 }
86 return 0;
87}
88
89/**
90 * Given a radio controller descriptor see if it is registered.
91 *
92 * @returns false if the rc does not exist or is quiescing; true otherwise.
93 */
94static bool uwb_rc_class_device_exists(struct uwb_rc *target_rc)
95{
96 struct device *dev;
97
98 dev = class_find_device(&uwb_rc_class, NULL, target_rc, find_rc);
99
100 return (dev != NULL);
101}
102
71/** 103/**
72 * uwb_pal_register - unregister a UWB PAL 104 * uwb_pal_unregister - unregister a UWB PAL
73 * @pal: the PAL 105 * @pal: the PAL
74 */ 106 */
75void uwb_pal_unregister(struct uwb_pal *pal) 107void uwb_pal_unregister(struct uwb_pal *pal)
@@ -85,7 +117,11 @@ void uwb_pal_unregister(struct uwb_pal *pal)
85 debugfs_remove(pal->debugfs_dir); 117 debugfs_remove(pal->debugfs_dir);
86 118
87 if (pal->device) { 119 if (pal->device) {
88 sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name); 120 /* remove link to the PAL in the UWB device's directory. */
121 if (uwb_rc_class_device_exists(rc))
122 sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name);
123
124 /* remove link to uwb_rc in the PAL device's directory. */
89 sysfs_remove_link(&pal->device->kobj, "uwb_rc"); 125 sysfs_remove_link(&pal->device->kobj, "uwb_rc");
90 } 126 }
91} 127}