diff options
Diffstat (limited to 'drivers/uwb')
-rw-r--r-- | drivers/uwb/drp-ie.c | 4 | ||||
-rw-r--r-- | drivers/uwb/hwa-rc.c | 16 | ||||
-rw-r--r-- | drivers/uwb/pal.c | 40 |
3 files changed, 55 insertions, 5 deletions
diff --git a/drivers/uwb/drp-ie.c b/drivers/uwb/drp-ie.c index 520673109a7e..b7d4f6b75eef 100644 --- a/drivers/uwb/drp-ie.c +++ b/drivers/uwb/drp-ie.c @@ -27,7 +27,7 @@ /* * Return the reason code for a reservations's DRP IE. */ -int uwb_rsv_reason_code(struct uwb_rsv *rsv) +static int uwb_rsv_reason_code(struct uwb_rsv *rsv) { static const int reason_codes[] = { [UWB_RSV_STATE_O_INITIATED] = UWB_DRP_REASON_ACCEPTED, @@ -55,7 +55,7 @@ int uwb_rsv_reason_code(struct uwb_rsv *rsv) /* * Return the reason code for a reservations's companion DRP IE . */ -int uwb_rsv_companion_reason_code(struct uwb_rsv *rsv) +static int uwb_rsv_companion_reason_code(struct uwb_rsv *rsv) { static const int companion_reason_codes[] = { [UWB_RSV_STATE_O_MOVE_EXPANDING] = UWB_DRP_REASON_ACCEPTED, diff --git a/drivers/uwb/hwa-rc.c b/drivers/uwb/hwa-rc.c index 0621abef9b4a..0257f35cfb9d 100644 --- a/drivers/uwb/hwa-rc.c +++ b/drivers/uwb/hwa-rc.c @@ -611,7 +611,16 @@ static int hwarc_reset(struct uwb_rc *uwb_rc) { struct hwarc *hwarc = uwb_rc->priv; - return usb_reset_device(hwarc->usb_dev); + int result; + + /* device lock must be held when calling usb_reset_device. */ + result = usb_lock_device_for_reset(hwarc->usb_dev, NULL); + if (result >= 0) { + result = usb_reset_device(hwarc->usb_dev); + usb_unlock_device(hwarc->usb_dev); + } + + return result; } /** @@ -709,8 +718,10 @@ static int hwarc_neep_init(struct uwb_rc *rc) error_neep_submit: usb_free_urb(hwarc->neep_urb); + hwarc->neep_urb = NULL; error_urb_alloc: free_page((unsigned long)hwarc->rd_buffer); + hwarc->rd_buffer = NULL; error_rd_buffer: return -ENOMEM; } @@ -723,7 +734,10 @@ static void hwarc_neep_release(struct uwb_rc *rc) usb_kill_urb(hwarc->neep_urb); usb_free_urb(hwarc->neep_urb); + hwarc->neep_urb = NULL; + free_page((unsigned long)hwarc->rd_buffer); + hwarc->rd_buffer = NULL; } /** 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) } EXPORT_SYMBOL_GPL(uwb_pal_register); +static int find_rc(struct device *dev, const void *data) +{ + const struct uwb_rc *target_rc = data; + struct uwb_rc *rc = dev_get_drvdata(dev); + + if (rc == NULL) { + WARN_ON(1); + return 0; + } + if (rc == target_rc) { + if (rc->ready == 0) + return 0; + else + return 1; + } + return 0; +} + +/** + * Given a radio controller descriptor see if it is registered. + * + * @returns false if the rc does not exist or is quiescing; true otherwise. + */ +static bool uwb_rc_class_device_exists(struct uwb_rc *target_rc) +{ + struct device *dev; + + dev = class_find_device(&uwb_rc_class, NULL, target_rc, find_rc); + + return (dev != NULL); +} + /** - * uwb_pal_register - unregister a UWB PAL + * uwb_pal_unregister - unregister a UWB PAL * @pal: the PAL */ void uwb_pal_unregister(struct uwb_pal *pal) @@ -85,7 +117,11 @@ void uwb_pal_unregister(struct uwb_pal *pal) debugfs_remove(pal->debugfs_dir); if (pal->device) { - sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name); + /* remove link to the PAL in the UWB device's directory. */ + if (uwb_rc_class_device_exists(rc)) + sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name); + + /* remove link to uwb_rc in the PAL device's directory. */ sysfs_remove_link(&pal->device->kobj, "uwb_rc"); } } |