diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2008-05-22 16:27:50 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-05-22 16:27:50 -0700 |
| commit | 54105dbd0951eb75bb7ecb5474405d6e1e08355e (patch) | |
| tree | b5ef3219bd9b075b68f80286ff0c2d74ea42444e /usb | |
| parent | 6a9419213a0dc24d2a1bd90f4093480652142f33 (diff) | |
| download | patches-54105dbd0951eb75bb7ecb5474405d6e1e08355e.tar.gz | |
driver core work
Diffstat (limited to 'usb')
| -rw-r--r-- | usb/uwb-stack-core.patch | 585 |
1 files changed, 293 insertions, 292 deletions
diff --git a/usb/uwb-stack-core.patch b/usb/uwb-stack-core.patch index b95dfaf778ad68..989d80f0a545ab 100644 --- a/usb/uwb-stack-core.patch +++ b/usb/uwb-stack-core.patch @@ -17,11 +17,11 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> --- drivers/uwb/driver.c | 142 ++++++++++++ drivers/uwb/lc-dev.c | 517 +++++++++++++++++++++++++++++++++++++++++++++ - drivers/uwb/lc-rc.c | 484 ++++++++++++++++++++++++++++++++++++++++++ + drivers/uwb/lc-rc.c | 485 ++++++++++++++++++++++++++++++++++++++++++ drivers/uwb/pal.c | 71 ++++++ drivers/uwb/uwb-internal.h | 283 ++++++++++++++++++++++++ drivers/uwb/uwbd.c | 425 ++++++++++++++++++++++++++++++++++++ - 6 files changed, 1922 insertions(+) + 6 files changed, 1923 insertions(+) --- /dev/null +++ b/drivers/uwb/driver.c @@ -690,7 +690,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> +EXPORT_SYMBOL_GPL(uwb_dev_for_each); --- /dev/null +++ b/drivers/uwb/lc-rc.c -@@ -0,0 +1,484 @@ +@@ -0,0 +1,485 @@ +/* + * Ultra Wide Band + * Life cycle of radio controllers @@ -1041,7 +1041,8 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + struct device *dev; + struct uwb_rc *rc = NULL; + -+ dev = class_find_device(&uwb_rc_class, target_rc, find_rc_try_get); ++ dev = class_find_device(&uwb_rc_class, NULL, target_rc, ++ find_rc_try_get); + if (dev) { + rc = dev_get_drvdata(dev); + __uwb_rc_get(rc); @@ -1096,7 +1097,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + struct device *dev; + struct uwb_rc *rc = NULL; + -+ dev = class_find_device(&uwb_rc_class, (void *)grandpa_dev, ++ dev = class_find_device(&uwb_rc_class, NULL, (void *)grandpa_dev, + find_rc_grandpa); + if (dev) + rc = dev_get_drvdata(dev); @@ -1130,7 +1131,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + struct device *dev; + struct uwb_rc *rc = NULL; + -+ dev = class_find_device(&uwb_rc_class, (void *)addr, ++ dev = class_find_device(&uwb_rc_class, NULL, (void *)addr, + find_rc_dev); + if (dev) + rc = dev_get_drvdata(dev); @@ -1250,292 +1251,6 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + INIT_LIST_HEAD(&rc->pals); +} --- /dev/null -+++ b/drivers/uwb/uwb-internal.h -@@ -0,0 +1,283 @@ -+/* -+ * Ultra Wide Band -+ * UWB internal API -+ * -+ * Copyright (C) 2005-2006 Intel Corporation -+ * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License version -+ * 2 as published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -+ * 02110-1301, USA. -+ * -+ * This contains most of the internal API for UWB. This is stuff used -+ * across the stack that of course, is of no interest to the rest. -+ * -+ * Some parts might end up going public (like uwb_rc_*())... -+ */ -+ -+#ifndef __UWB_INTERNAL_H__ -+#define __UWB_INTERNAL_H__ -+ -+#include <linux/version.h> -+#include <linux/kernel.h> -+#include <linux/device.h> -+#include <linux/uwb.h> -+#include <linux/mutex.h> -+ -+struct uwb_beca_e; -+ -+/* General device API */ -+extern void uwb_dev_init(struct uwb_dev *uwb_dev); -+extern int __uwb_dev_offair(struct uwb_dev *, struct uwb_rc *); -+extern int uwb_dev_add(struct uwb_dev *uwb_dev, struct device *parent_dev, -+ struct uwb_rc *parent_rc); -+extern void uwb_dev_rm(struct uwb_dev *uwb_dev); -+extern void uwbd_dev_onair(struct uwb_rc *, struct uwb_beca_e *); -+extern void uwbd_dev_offair(struct uwb_beca_e *); -+void uwb_notify(struct uwb_rc *rc, struct uwb_dev *uwb_dev, enum uwb_notifs event); -+ -+/* General UWB Radio Controller Internal API */ -+extern struct uwb_rc *__uwb_rc_try_get(struct uwb_rc *); -+static inline struct uwb_rc *__uwb_rc_get(struct uwb_rc *rc) -+{ -+ uwb_dev_get(&rc->uwb_dev); -+ return rc; -+} -+ -+static inline void __uwb_rc_put(struct uwb_rc *rc) -+{ -+ uwb_dev_put(&rc->uwb_dev); -+} -+ -+extern int uwb_rc_reset(struct uwb_rc *rc); -+extern int uwb_rc_beacon(struct uwb_rc *rc, -+ int channel, unsigned bpst_offset); -+extern int uwb_rc_scan(struct uwb_rc *rc, -+ unsigned channel, enum uwb_scan_type type, -+ unsigned bpst_offset); -+extern int uwb_rc_send_all_drp_ie(struct uwb_rc *rc); -+extern ssize_t uwb_rc_print_IEs(struct uwb_rc *rc, char *, size_t); -+extern void uwb_rc_ie_init(struct uwb_rc *); -+extern void uwb_rc_ie_init(struct uwb_rc *); -+extern ssize_t uwb_rc_ie_setup(struct uwb_rc *); -+extern void uwb_rc_ie_release(struct uwb_rc *); -+extern int uwb_rc_ie_add(struct uwb_rc *, -+ const struct uwb_ie_hdr *, size_t); -+extern int uwb_rc_ie_rm(struct uwb_rc *, enum uwb_ie); -+extern int uwb_rc_set_identification_ie(struct uwb_rc *); -+ -+extern const char *uwb_rc_strerror(unsigned code); -+ -+/* -+ * Time to wait for a response to an RC command. -+ * -+ * Some commands can take a long time to response. e.g., START_BEACON -+ * may scan for several superframes before joining an existing beacon -+ * group and this can take around 600 ms. -+ */ -+#define UWB_RC_CMD_TIMEOUT_MS 1000 /* ms */ -+ -+/* -+ * Notification/Event Handlers -+ */ -+ -+struct uwb_rc_neh; -+ -+typedef void (*uwb_rc_neh_cb_f)(struct uwb_rc *rc, void *arg, -+ struct uwb_rceb *reply, ssize_t reply_size); -+ -+void uwb_rc_neh_create(struct uwb_rc *rc); -+void uwb_rc_neh_destroy(struct uwb_rc *rc); -+ -+struct uwb_rc_neh *uwb_rc_neh_add(struct uwb_rc *rc, struct uwb_rccb *cmd, -+ u8 expected_type, u16 expected_event, -+ uwb_rc_neh_cb_f cb, void *arg); -+void uwb_rc_neh_rm(struct uwb_rc *rc, struct uwb_rc_neh *neh); -+void uwb_rc_neh_arm(struct uwb_rc *rc, struct uwb_rc_neh *neh); -+void uwb_rc_neh_put(struct uwb_rc_neh *neh); -+ -+/* Event size tables */ -+extern int uwb_est_create(void); -+extern void uwb_est_destroy(void); -+ -+ -+/* -+ * UWB Events & management daemon -+ * -+ * The UWBD daemon receives events following the RCI interface for -+ * notifications (with an RCEB header)...basically it acts on the -+ * notifications from that the radio controllers pipe to him. -+ * -+ * FIXME: rename events to notifications (as that's what they -+ * are)...however, that'll mess with uwb_notifs. -+ */ -+ -+/** -+ * UWB Event -+ * -+ * @rc: Radio controller that emitted the event (referenced) -+ * @size: Size of the buffer (ie: Guaranteed to contain at least -+ * a full 'struct uwb_rceb') -+ * @ts_jiffies: Timestamp, when was it received -+ * @rceb: Pointer to a kmalloced() event payload -+ */ -+/* FIXME: rename to uwb_evt for consistency */ -+struct uwb_event { -+ struct list_head list_node; -+ struct uwb_rc *rc; -+ size_t size; -+ unsigned long ts_jiffies; -+ struct uwb_rceb *rceb; -+}; -+extern void uwbd_start(void); -+extern void uwbd_stop(void); -+extern struct uwb_event *uwb_event_alloc(size_t, gfp_t gfp_mask); -+extern void uwbd_event_queue(struct uwb_event *); -+ -+/* UWB event handlers */ -+extern int uwbd_evt_handle_rc_beacon(struct uwb_event *); -+extern int uwbd_evt_handle_rc_beacon_size(struct uwb_event *); -+extern int uwbd_evt_handle_rc_bpoie_change(struct uwb_event *); -+extern int uwbd_evt_handle_rc_bp_slot_change(struct uwb_event *); -+extern int uwbd_evt_handle_rc_drp(struct uwb_event *); -+extern int uwbd_evt_handle_rc_drp_avail(struct uwb_event *); -+ -+ -+/* -+ * Address management -+ */ -+int uwb_rc_dev_addr_assign(struct uwb_rc *rc); -+int uwbd_evt_handle_rc_dev_addr_conflict(struct uwb_event *evt); -+ -+/* -+ * UWB Beacon Cache -+ * -+ * Each beacon we received is kept in a cache--when we receive that -+ * beacon consistently, that means there is a new device that we have -+ * to add to the system. -+ */ -+ -+extern unsigned long beacon_timeout_ms; -+ -+/** Beacon cache list */ -+struct uwb_beca { -+ struct list_head list; -+ size_t entries; -+ struct mutex mutex; -+}; -+ -+extern struct uwb_beca uwb_beca; -+ -+/** -+ * Beacon cache entry -+ * -+ * @jiffies_refresh: last time a beacon was received that refreshed -+ * this cache entry. -+ * @uwb_dev: device connected to this beacon. This pointer is not -+ * safe, you need to get it with uwb_dev_try_get() -+ * -+ * @hits: how many time we have seen this beacon since last time we -+ * cleared it -+ */ -+struct uwb_beca_e { -+ struct mutex mutex; -+ struct kref refcnt; -+ struct list_head node; -+ struct uwb_mac_addr *mac_addr; -+ struct uwb_dev_addr dev_addr; -+ u8 hits; -+ unsigned long ts_jiffies; -+ struct uwb_dev *uwb_dev; -+ struct uwb_rc_evt_beacon *be; -+ struct stats lqe_stats, rssi_stats; /* radio statistics */ -+}; -+struct uwb_beacon_frame; -+extern ssize_t uwb_bce_print_IEs(struct uwb_dev *, struct uwb_beca_e *, -+ char *, size_t); -+extern struct uwb_beca_e *__uwb_beca_add(struct uwb_rc_evt_beacon *, -+ struct uwb_beacon_frame *, -+ unsigned long); -+ -+extern void uwb_bce_kfree(struct kref *_bce); -+static inline void uwb_bce_get(struct uwb_beca_e *bce) -+{ -+ kref_get(&bce->refcnt); -+} -+static inline void uwb_bce_put(struct uwb_beca_e *bce) -+{ -+ kref_put(&bce->refcnt, uwb_bce_kfree); -+} -+extern void uwb_beca_purge(void); -+extern void uwb_beca_release(void); -+ -+struct uwb_dev *uwb_dev_get_by_devaddr(struct uwb_rc *rc, -+ const struct uwb_dev_addr *devaddr); -+struct uwb_dev *uwb_dev_get_by_macaddr(struct uwb_rc *rc, -+ const struct uwb_mac_addr *macaddr); -+ -+/* -- UWB Sysfs representation */ -+extern struct class uwb_rc_class; -+extern struct device_attribute dev_attr_mac_address; -+extern struct device_attribute dev_attr_dev_address; -+extern struct device_attribute dev_attr_beacon; -+extern struct device_attribute dev_attr_scan; -+extern struct device_attribute dev_attr_event_stats; -+ -+/* -- DRP Bandwidth allocator: bandwidth allocations, reservations, DRP */ -+void uwb_rsv_init(struct uwb_rc *rc); -+int uwb_rsv_setup(struct uwb_rc *rc); -+void uwb_rsv_cleanup(struct uwb_rc *rc); -+ -+void uwb_rsv_set_state(struct uwb_rsv *rsv, enum uwb_rsv_state new_state); -+void uwb_rsv_remove(struct uwb_rsv *rsv); -+struct uwb_rsv *uwb_rsv_find(struct uwb_rc *rc, struct uwb_dev *src, -+ struct uwb_ie_drp *drp_ie); -+void uwb_rsv_sched_update(struct uwb_rc *rc); -+ -+void uwb_drp_handle_timeout(struct uwb_rsv *rsv); -+int uwb_drp_ie_update(struct uwb_rsv *rsv); -+void uwb_drp_ie_to_bm(struct uwb_mas_bm *bm, const struct uwb_ie_drp *drp_ie); -+ -+void uwb_drp_avail_init(struct uwb_rc *rc); -+int uwb_drp_avail_reserve_pending(struct uwb_rc *rc, struct uwb_mas_bm *mas); -+void uwb_drp_avail_reserve(struct uwb_rc *rc, struct uwb_mas_bm *mas); -+void uwb_drp_avail_release(struct uwb_rc *rc, struct uwb_mas_bm *mas); -+void uwb_drp_avail_ie_update(struct uwb_rc *rc); -+ -+/* -- PAL support */ -+void uwb_rc_pal_init(struct uwb_rc *rc); -+ -+/* -- Misc */ -+ -+extern ssize_t uwb_mac_frame_hdr_print(char *, size_t, -+ const struct uwb_mac_frame_hdr *); -+ -+/* -- Debug interface */ -+void uwb_dbg_init(void); -+void uwb_dbg_exit(void); -+void uwb_dbg_add_rc(struct uwb_rc *rc); -+void uwb_dbg_del_rc(struct uwb_rc *rc); -+ -+/* Workarounds for version specific stuff */ -+ -+static inline void uwb_dev_lock(struct uwb_dev *uwb_dev) -+{ -+ down(&uwb_dev->dev.sem); -+} -+ -+static inline void uwb_dev_unlock(struct uwb_dev *uwb_dev) -+{ -+ up(&uwb_dev->dev.sem); -+} -+ -+#endif /* #ifndef __UWB_INTERNAL_H__ */ ---- /dev/null +++ b/drivers/uwb/uwbd.c @@ -0,0 +1,425 @@ +/* @@ -1963,3 +1678,289 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + return consumed; +} +DEVICE_ATTR(event_stats, S_IRUGO, uwbd_evt_stats_show, NULL); +--- /dev/null ++++ b/drivers/uwb/uwb-internal.h +@@ -0,0 +1,283 @@ ++/* ++ * Ultra Wide Band ++ * UWB internal API ++ * ++ * Copyright (C) 2005-2006 Intel Corporation ++ * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License version ++ * 2 as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ * 02110-1301, USA. ++ * ++ * This contains most of the internal API for UWB. This is stuff used ++ * across the stack that of course, is of no interest to the rest. ++ * ++ * Some parts might end up going public (like uwb_rc_*())... ++ */ ++ ++#ifndef __UWB_INTERNAL_H__ ++#define __UWB_INTERNAL_H__ ++ ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/device.h> ++#include <linux/uwb.h> ++#include <linux/mutex.h> ++ ++struct uwb_beca_e; ++ ++/* General device API */ ++extern void uwb_dev_init(struct uwb_dev *uwb_dev); ++extern int __uwb_dev_offair(struct uwb_dev *, struct uwb_rc *); ++extern int uwb_dev_add(struct uwb_dev *uwb_dev, struct device *parent_dev, ++ struct uwb_rc *parent_rc); ++extern void uwb_dev_rm(struct uwb_dev *uwb_dev); ++extern void uwbd_dev_onair(struct uwb_rc *, struct uwb_beca_e *); ++extern void uwbd_dev_offair(struct uwb_beca_e *); ++void uwb_notify(struct uwb_rc *rc, struct uwb_dev *uwb_dev, enum uwb_notifs event); ++ ++/* General UWB Radio Controller Internal API */ ++extern struct uwb_rc *__uwb_rc_try_get(struct uwb_rc *); ++static inline struct uwb_rc *__uwb_rc_get(struct uwb_rc *rc) ++{ ++ uwb_dev_get(&rc->uwb_dev); ++ return rc; ++} ++ ++static inline void __uwb_rc_put(struct uwb_rc *rc) ++{ ++ uwb_dev_put(&rc->uwb_dev); ++} ++ ++extern int uwb_rc_reset(struct uwb_rc *rc); ++extern int uwb_rc_beacon(struct uwb_rc *rc, ++ int channel, unsigned bpst_offset); ++extern int uwb_rc_scan(struct uwb_rc *rc, ++ unsigned channel, enum uwb_scan_type type, ++ unsigned bpst_offset); ++extern int uwb_rc_send_all_drp_ie(struct uwb_rc *rc); ++extern ssize_t uwb_rc_print_IEs(struct uwb_rc *rc, char *, size_t); ++extern void uwb_rc_ie_init(struct uwb_rc *); ++extern void uwb_rc_ie_init(struct uwb_rc *); ++extern ssize_t uwb_rc_ie_setup(struct uwb_rc *); ++extern void uwb_rc_ie_release(struct uwb_rc *); ++extern int uwb_rc_ie_add(struct uwb_rc *, ++ const struct uwb_ie_hdr *, size_t); ++extern int uwb_rc_ie_rm(struct uwb_rc *, enum uwb_ie); ++extern int uwb_rc_set_identification_ie(struct uwb_rc *); ++ ++extern const char *uwb_rc_strerror(unsigned code); ++ ++/* ++ * Time to wait for a response to an RC command. ++ * ++ * Some commands can take a long time to response. e.g., START_BEACON ++ * may scan for several superframes before joining an existing beacon ++ * group and this can take around 600 ms. ++ */ ++#define UWB_RC_CMD_TIMEOUT_MS 1000 /* ms */ ++ ++/* ++ * Notification/Event Handlers ++ */ ++ ++struct uwb_rc_neh; ++ ++typedef void (*uwb_rc_neh_cb_f)(struct uwb_rc *rc, void *arg, ++ struct uwb_rceb *reply, ssize_t reply_size); ++ ++void uwb_rc_neh_create(struct uwb_rc *rc); ++void uwb_rc_neh_destroy(struct uwb_rc *rc); ++ ++struct uwb_rc_neh *uwb_rc_neh_add(struct uwb_rc *rc, struct uwb_rccb *cmd, ++ u8 expected_type, u16 expected_event, ++ uwb_rc_neh_cb_f cb, void *arg); ++void uwb_rc_neh_rm(struct uwb_rc *rc, struct uwb_rc_neh *neh); ++void uwb_rc_neh_arm(struct uwb_rc *rc, struct uwb_rc_neh *neh); ++void uwb_rc_neh_put(struct uwb_rc_neh *neh); ++ ++/* Event size tables */ ++extern int uwb_est_create(void); ++extern void uwb_est_destroy(void); ++ ++ ++/* ++ * UWB Events & management daemon ++ * ++ * The UWBD daemon receives events following the RCI interface for ++ * notifications (with an RCEB header)...basically it acts on the ++ * notifications from that the radio controllers pipe to him. ++ * ++ * FIXME: rename events to notifications (as that's what they ++ * are)...however, that'll mess with uwb_notifs. ++ */ ++ ++/** ++ * UWB Event ++ * ++ * @rc: Radio controller that emitted the event (referenced) ++ * @size: Size of the buffer (ie: Guaranteed to contain at least ++ * a full 'struct uwb_rceb') ++ * @ts_jiffies: Timestamp, when was it received ++ * @rceb: Pointer to a kmalloced() event payload ++ */ ++/* FIXME: rename to uwb_evt for consistency */ ++struct uwb_event { ++ struct list_head list_node; ++ struct uwb_rc *rc; ++ size_t size; ++ unsigned long ts_jiffies; ++ struct uwb_rceb *rceb; ++}; ++extern void uwbd_start(void); ++extern void uwbd_stop(void); ++extern struct uwb_event *uwb_event_alloc(size_t, gfp_t gfp_mask); ++extern void uwbd_event_queue(struct uwb_event *); ++ ++/* UWB event handlers */ ++extern int uwbd_evt_handle_rc_beacon(struct uwb_event *); ++extern int uwbd_evt_handle_rc_beacon_size(struct uwb_event *); ++extern int uwbd_evt_handle_rc_bpoie_change(struct uwb_event *); ++extern int uwbd_evt_handle_rc_bp_slot_change(struct uwb_event *); ++extern int uwbd_evt_handle_rc_drp(struct uwb_event *); ++extern int uwbd_evt_handle_rc_drp_avail(struct uwb_event *); ++ ++ ++/* ++ * Address management ++ */ ++int uwb_rc_dev_addr_assign(struct uwb_rc *rc); ++int uwbd_evt_handle_rc_dev_addr_conflict(struct uwb_event *evt); ++ ++/* ++ * UWB Beacon Cache ++ * ++ * Each beacon we received is kept in a cache--when we receive that ++ * beacon consistently, that means there is a new device that we have ++ * to add to the system. ++ */ ++ ++extern unsigned long beacon_timeout_ms; ++ ++/** Beacon cache list */ ++struct uwb_beca { ++ struct list_head list; ++ size_t entries; ++ struct mutex mutex; ++}; ++ ++extern struct uwb_beca uwb_beca; ++ ++/** ++ * Beacon cache entry ++ * ++ * @jiffies_refresh: last time a beacon was received that refreshed ++ * this cache entry. ++ * @uwb_dev: device connected to this beacon. This pointer is not ++ * safe, you need to get it with uwb_dev_try_get() ++ * ++ * @hits: how many time we have seen this beacon since last time we ++ * cleared it ++ */ ++struct uwb_beca_e { ++ struct mutex mutex; ++ struct kref refcnt; ++ struct list_head node; ++ struct uwb_mac_addr *mac_addr; ++ struct uwb_dev_addr dev_addr; ++ u8 hits; ++ unsigned long ts_jiffies; ++ struct uwb_dev *uwb_dev; ++ struct uwb_rc_evt_beacon *be; ++ struct stats lqe_stats, rssi_stats; /* radio statistics */ ++}; ++struct uwb_beacon_frame; ++extern ssize_t uwb_bce_print_IEs(struct uwb_dev *, struct uwb_beca_e *, ++ char *, size_t); ++extern struct uwb_beca_e *__uwb_beca_add(struct uwb_rc_evt_beacon *, ++ struct uwb_beacon_frame *, ++ unsigned long); ++ ++extern void uwb_bce_kfree(struct kref *_bce); ++static inline void uwb_bce_get(struct uwb_beca_e *bce) ++{ ++ kref_get(&bce->refcnt); ++} ++static inline void uwb_bce_put(struct uwb_beca_e *bce) ++{ ++ kref_put(&bce->refcnt, uwb_bce_kfree); ++} ++extern void uwb_beca_purge(void); ++extern void uwb_beca_release(void); ++ ++struct uwb_dev *uwb_dev_get_by_devaddr(struct uwb_rc *rc, ++ const struct uwb_dev_addr *devaddr); ++struct uwb_dev *uwb_dev_get_by_macaddr(struct uwb_rc *rc, ++ const struct uwb_mac_addr *macaddr); ++ ++/* -- UWB Sysfs representation */ ++extern struct class uwb_rc_class; ++extern struct device_attribute dev_attr_mac_address; ++extern struct device_attribute dev_attr_dev_address; ++extern struct device_attribute dev_attr_beacon; ++extern struct device_attribute dev_attr_scan; ++extern struct device_attribute dev_attr_event_stats; ++ ++/* -- DRP Bandwidth allocator: bandwidth allocations, reservations, DRP */ ++void uwb_rsv_init(struct uwb_rc *rc); ++int uwb_rsv_setup(struct uwb_rc *rc); ++void uwb_rsv_cleanup(struct uwb_rc *rc); ++ ++void uwb_rsv_set_state(struct uwb_rsv *rsv, enum uwb_rsv_state new_state); ++void uwb_rsv_remove(struct uwb_rsv *rsv); ++struct uwb_rsv *uwb_rsv_find(struct uwb_rc *rc, struct uwb_dev *src, ++ struct uwb_ie_drp *drp_ie); ++void uwb_rsv_sched_update(struct uwb_rc *rc); ++ ++void uwb_drp_handle_timeout(struct uwb_rsv *rsv); ++int uwb_drp_ie_update(struct uwb_rsv *rsv); ++void uwb_drp_ie_to_bm(struct uwb_mas_bm *bm, const struct uwb_ie_drp *drp_ie); ++ ++void uwb_drp_avail_init(struct uwb_rc *rc); ++int uwb_drp_avail_reserve_pending(struct uwb_rc *rc, struct uwb_mas_bm *mas); ++void uwb_drp_avail_reserve(struct uwb_rc *rc, struct uwb_mas_bm *mas); ++void uwb_drp_avail_release(struct uwb_rc *rc, struct uwb_mas_bm *mas); ++void uwb_drp_avail_ie_update(struct uwb_rc *rc); ++ ++/* -- PAL support */ ++void uwb_rc_pal_init(struct uwb_rc *rc); ++ ++/* -- Misc */ ++ ++extern ssize_t uwb_mac_frame_hdr_print(char *, size_t, ++ const struct uwb_mac_frame_hdr *); ++ ++/* -- Debug interface */ ++void uwb_dbg_init(void); ++void uwb_dbg_exit(void); ++void uwb_dbg_add_rc(struct uwb_rc *rc); ++void uwb_dbg_del_rc(struct uwb_rc *rc); ++ ++/* Workarounds for version specific stuff */ ++ ++static inline void uwb_dev_lock(struct uwb_dev *uwb_dev) ++{ ++ down(&uwb_dev->dev.sem); ++} ++ ++static inline void uwb_dev_unlock(struct uwb_dev *uwb_dev) ++{ ++ up(&uwb_dev->dev.sem); ++} ++ ++#endif /* #ifndef __UWB_INTERNAL_H__ */ |
