Commit b60066c1 authored by David Vrabel's avatar David Vrabel Committed by David Vrabel

uwb: add symlinks in sysfs between radio controllers and PALs

Add a facility for PALs to have symlinks to their radio controller
(and vice-versa) and make WUSB host controllers use this.
Signed-off-by: default avatarDavid Vrabel <david.vrabel@csr.com>
parent b63795fa
...@@ -26,6 +26,9 @@ int wusbhc_pal_register(struct wusbhc *wusbhc) ...@@ -26,6 +26,9 @@ int wusbhc_pal_register(struct wusbhc *wusbhc)
{ {
uwb_pal_init(&wusbhc->pal); uwb_pal_init(&wusbhc->pal);
wusbhc->pal.name = "wusbhc";
wusbhc->pal.device = wusbhc->usb_hcd.self.controller;
return uwb_pal_register(wusbhc->uwb_rc, &wusbhc->pal); return uwb_pal_register(wusbhc->uwb_rc, &wusbhc->pal);
} }
......
...@@ -192,13 +192,8 @@ int wusbhc_create(struct wusbhc *wusbhc) ...@@ -192,13 +192,8 @@ int wusbhc_create(struct wusbhc *wusbhc)
result = wusbhc_sec_create(wusbhc); result = wusbhc_sec_create(wusbhc);
if (result < 0) if (result < 0)
goto error_sec_create; goto error_sec_create;
result = wusbhc_pal_register(wusbhc);
if (result < 0)
goto error_pal_register;
return 0; return 0;
error_pal_register:
wusbhc_sec_destroy(wusbhc);
error_sec_create: error_sec_create:
wusbhc_rh_destroy(wusbhc); wusbhc_rh_destroy(wusbhc);
error_rh_create: error_rh_create:
...@@ -235,7 +230,14 @@ int wusbhc_b_create(struct wusbhc *wusbhc) ...@@ -235,7 +230,14 @@ int wusbhc_b_create(struct wusbhc *wusbhc)
dev_err(dev, "Cannot register WUSBHC attributes: %d\n", result); dev_err(dev, "Cannot register WUSBHC attributes: %d\n", result);
goto error_create_attr_group; goto error_create_attr_group;
} }
/* Yep, I plan to add stuff here... */
result = wusbhc_pal_register(wusbhc);
if (result < 0)
goto error_pal_register;
return 0;
error_pal_register:
sysfs_remove_group(wusbhc_kobj(wusbhc), &wusbhc_attr_group);
error_create_attr_group: error_create_attr_group:
return result; return result;
} }
...@@ -243,13 +245,13 @@ EXPORT_SYMBOL_GPL(wusbhc_b_create); ...@@ -243,13 +245,13 @@ EXPORT_SYMBOL_GPL(wusbhc_b_create);
void wusbhc_b_destroy(struct wusbhc *wusbhc) void wusbhc_b_destroy(struct wusbhc *wusbhc)
{ {
wusbhc_pal_unregister(wusbhc);
sysfs_remove_group(wusbhc_kobj(wusbhc), &wusbhc_attr_group); sysfs_remove_group(wusbhc_kobj(wusbhc), &wusbhc_attr_group);
} }
EXPORT_SYMBOL_GPL(wusbhc_b_destroy); EXPORT_SYMBOL_GPL(wusbhc_b_destroy);
void wusbhc_destroy(struct wusbhc *wusbhc) void wusbhc_destroy(struct wusbhc *wusbhc)
{ {
wusbhc_pal_unregister(wusbhc);
wusbhc_sec_destroy(wusbhc); wusbhc_sec_destroy(wusbhc);
wusbhc_rh_destroy(wusbhc); wusbhc_rh_destroy(wusbhc);
wusbhc_devconnect_destroy(wusbhc); wusbhc_devconnect_destroy(wusbhc);
......
...@@ -39,6 +39,21 @@ EXPORT_SYMBOL_GPL(uwb_pal_init); ...@@ -39,6 +39,21 @@ EXPORT_SYMBOL_GPL(uwb_pal_init);
*/ */
int uwb_pal_register(struct uwb_rc *rc, struct uwb_pal *pal) int uwb_pal_register(struct uwb_rc *rc, struct uwb_pal *pal)
{ {
int ret;
if (pal->device) {
ret = sysfs_create_link(&pal->device->kobj,
&rc->uwb_dev.dev.kobj, "uwb_rc");
if (ret < 0)
return ret;
ret = sysfs_create_link(&rc->uwb_dev.dev.kobj,
&pal->device->kobj, pal->name);
if (ret < 0) {
sysfs_remove_link(&pal->device->kobj, "uwb_rc");
return ret;
}
}
spin_lock(&rc->pal_lock); spin_lock(&rc->pal_lock);
list_add(&pal->node, &rc->pals); list_add(&pal->node, &rc->pals);
spin_unlock(&rc->pal_lock); spin_unlock(&rc->pal_lock);
...@@ -57,6 +72,11 @@ void uwb_pal_unregister(struct uwb_rc *rc, struct uwb_pal *pal) ...@@ -57,6 +72,11 @@ void uwb_pal_unregister(struct uwb_rc *rc, struct uwb_pal *pal)
spin_lock(&rc->pal_lock); spin_lock(&rc->pal_lock);
list_del(&pal->node); list_del(&pal->node);
spin_unlock(&rc->pal_lock); spin_unlock(&rc->pal_lock);
if (pal->device) {
sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name);
sysfs_remove_link(&pal->device->kobj, "uwb_rc");
}
} }
EXPORT_SYMBOL_GPL(uwb_pal_unregister); EXPORT_SYMBOL_GPL(uwb_pal_unregister);
......
...@@ -361,6 +361,9 @@ struct uwb_rc { ...@@ -361,6 +361,9 @@ struct uwb_rc {
/** /**
* struct uwb_pal - a UWB PAL * struct uwb_pal - a UWB PAL
* @name: descriptive name for this PAL (wushc, wlp, etc.).
* @device: a device for the PAL. Used to link the PAL and the radio
* controller in sysfs.
* @new_rsv: called when a peer requests a reservation (may be NULL if * @new_rsv: called when a peer requests a reservation (may be NULL if
* the PAL cannot accept reservation requests). * the PAL cannot accept reservation requests).
* *
...@@ -379,7 +382,8 @@ struct uwb_rc { ...@@ -379,7 +382,8 @@ struct uwb_rc {
*/ */
struct uwb_pal { struct uwb_pal {
struct list_head node; struct list_head node;
const char *name;
struct device *device;
void (*new_rsv)(struct uwb_rsv *rsv); void (*new_rsv)(struct uwb_rsv *rsv);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment