summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@csr.com>2008-09-17 16:34:40 +0100
committerDavid Vrabel <dv02@dv02pc01.europe.root.pri>2008-09-17 16:54:35 +0100
commitb60066c141997ac2e4ef08459b75638ae86ae781 (patch)
treee7c89b8652a0f0416d0da338c31337991bf57c93
parentb63795fa3a41151040b86119750a7df508d40cda (diff)
downloadkernel-crypto-b60066c141997ac2e4ef08459b75638ae86ae781.tar.gz
kernel-crypto-b60066c141997ac2e4ef08459b75638ae86ae781.tar.xz
kernel-crypto-b60066c141997ac2e4ef08459b75638ae86ae781.zip
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: David Vrabel <david.vrabel@csr.com>
-rw-r--r--drivers/usb/wusbcore/pal.c3
-rw-r--r--drivers/usb/wusbcore/wusbhc.c16
-rw-r--r--drivers/uwb/pal.c20
-rw-r--r--include/linux/uwb.h6
4 files changed, 37 insertions, 8 deletions
diff --git a/drivers/usb/wusbcore/pal.c b/drivers/usb/wusbcore/pal.c
index cc126b44473..7cc51e9905c 100644
--- a/drivers/usb/wusbcore/pal.c
+++ b/drivers/usb/wusbcore/pal.c
@@ -26,6 +26,9 @@ int wusbhc_pal_register(struct wusbhc *wusbhc)
{
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);
}
diff --git a/drivers/usb/wusbcore/wusbhc.c b/drivers/usb/wusbcore/wusbhc.c
index 1149b1e59c8..07c63a31c79 100644
--- a/drivers/usb/wusbcore/wusbhc.c
+++ b/drivers/usb/wusbcore/wusbhc.c
@@ -192,13 +192,8 @@ int wusbhc_create(struct wusbhc *wusbhc)
result = wusbhc_sec_create(wusbhc);
if (result < 0)
goto error_sec_create;
- result = wusbhc_pal_register(wusbhc);
- if (result < 0)
- goto error_pal_register;
return 0;
-error_pal_register:
- wusbhc_sec_destroy(wusbhc);
error_sec_create:
wusbhc_rh_destroy(wusbhc);
error_rh_create:
@@ -235,7 +230,14 @@ int wusbhc_b_create(struct wusbhc *wusbhc)
dev_err(dev, "Cannot register WUSBHC attributes: %d\n", result);
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:
return result;
}
@@ -243,13 +245,13 @@ EXPORT_SYMBOL_GPL(wusbhc_b_create);
void wusbhc_b_destroy(struct wusbhc *wusbhc)
{
+ wusbhc_pal_unregister(wusbhc);
sysfs_remove_group(wusbhc_kobj(wusbhc), &wusbhc_attr_group);
}
EXPORT_SYMBOL_GPL(wusbhc_b_destroy);
void wusbhc_destroy(struct wusbhc *wusbhc)
{
- wusbhc_pal_unregister(wusbhc);
wusbhc_sec_destroy(wusbhc);
wusbhc_rh_destroy(wusbhc);
wusbhc_devconnect_destroy(wusbhc);
diff --git a/drivers/uwb/pal.c b/drivers/uwb/pal.c
index 5508993a820..1afb38eacb9 100644
--- a/drivers/uwb/pal.c
+++ b/drivers/uwb/pal.c
@@ -39,6 +39,21 @@ EXPORT_SYMBOL_GPL(uwb_pal_init);
*/
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);
list_add(&pal->node, &rc->pals);
spin_unlock(&rc->pal_lock);
@@ -57,6 +72,11 @@ void uwb_pal_unregister(struct uwb_rc *rc, struct uwb_pal *pal)
spin_lock(&rc->pal_lock);
list_del(&pal->node);
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);
diff --git a/include/linux/uwb.h b/include/linux/uwb.h
index 0cd35937e12..f9ccbd9a2ce 100644
--- a/include/linux/uwb.h
+++ b/include/linux/uwb.h
@@ -361,6 +361,9 @@ struct uwb_rc {
/**
* 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
* the PAL cannot accept reservation requests).
*
@@ -379,7 +382,8 @@ struct uwb_rc {
*/
struct uwb_pal {
struct list_head node;
-
+ const char *name;
+ struct device *device;
void (*new_rsv)(struct uwb_rsv *rsv);
};