Commit fbbde074abf41efddbb5daeb1690d7281d613a8e

Authored by Thomas Pugliese
Committed by Greg Kroah-Hartman
1 parent 644f6a121a

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>

Showing 1 changed file with 38 additions and 2 deletions Side-by-side Diff

... ... @@ -68,8 +68,40 @@
68 68 }
69 69 EXPORT_SYMBOL_GPL(uwb_pal_register);
70 70  
  71 +static 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 +
71 89 /**
72   - * uwb_pal_register - unregister a UWB PAL
  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 + */
  94 +static 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 +
  103 +/**
  104 + * uwb_pal_unregister - unregister a UWB PAL
73 105 * @pal: the PAL
74 106 */
75 107 void uwb_pal_unregister(struct uwb_pal *pal)
... ... @@ -85,7 +117,11 @@
85 117 debugfs_remove(pal->debugfs_dir);
86 118  
87 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 125 sysfs_remove_link(&pal->device->kobj, "uwb_rc");
90 126 }
91 127 }