Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 125112
b: refs/heads/master
c: fec1a59
h: refs/heads/master
v: v3
  • Loading branch information
Stefano Panella authored and David Vrabel committed Nov 4, 2008
1 parent 67412ab commit 9d1ab01
Show file tree
Hide file tree
Showing 7 changed files with 101 additions and 123 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6d5a681dfb583b2f1eefe7cd5505419ca2d4d6c8
refs/heads/master: fec1a5932f16c0eb1b3f5ca2e18d81d860924088
61 changes: 30 additions & 31 deletions trunk/drivers/uwb/beacon.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,12 +168,6 @@ int uwb_rc_beacon(struct uwb_rc *rc, int channel, unsigned bpst_offset)
* FIXME: use something faster for search than a list
*/

struct uwb_beca uwb_beca = {
.list = LIST_HEAD_INIT(uwb_beca.list),
.mutex = __MUTEX_INITIALIZER(uwb_beca.mutex)
};


void uwb_bce_kfree(struct kref *_bce)
{
struct uwb_beca_e *bce = container_of(_bce, struct uwb_beca_e, refcnt);
Expand All @@ -185,10 +179,11 @@ void uwb_bce_kfree(struct kref *_bce)

/* Find a beacon by dev addr in the cache */
static
struct uwb_beca_e *__uwb_beca_find_bydev(const struct uwb_dev_addr *dev_addr)
struct uwb_beca_e *__uwb_beca_find_bydev(struct uwb_rc *rc,
const struct uwb_dev_addr *dev_addr)
{
struct uwb_beca_e *bce, *next;
list_for_each_entry_safe(bce, next, &uwb_beca.list, node) {
list_for_each_entry_safe(bce, next, &rc->uwb_beca.list, node) {
d_printf(6, NULL, "looking for addr %02x:%02x in %02x:%02x\n",
dev_addr->data[0], dev_addr->data[1],
bce->dev_addr.data[0], bce->dev_addr.data[1]);
Expand All @@ -202,10 +197,11 @@ struct uwb_beca_e *__uwb_beca_find_bydev(const struct uwb_dev_addr *dev_addr)

/* Find a beacon by dev addr in the cache */
static
struct uwb_beca_e *__uwb_beca_find_bymac(const struct uwb_mac_addr *mac_addr)
struct uwb_beca_e *__uwb_beca_find_bymac(struct uwb_rc *rc,
const struct uwb_mac_addr *mac_addr)
{
struct uwb_beca_e *bce, *next;
list_for_each_entry_safe(bce, next, &uwb_beca.list, node) {
list_for_each_entry_safe(bce, next, &rc->uwb_beca.list, node) {
if (!memcmp(bce->mac_addr, mac_addr->data,
sizeof(struct uwb_mac_addr)))
goto out;
Expand All @@ -229,11 +225,11 @@ struct uwb_dev *uwb_dev_get_by_devaddr(struct uwb_rc *rc,
struct uwb_dev *found = NULL;
struct uwb_beca_e *bce;

mutex_lock(&uwb_beca.mutex);
bce = __uwb_beca_find_bydev(devaddr);
mutex_lock(&rc->uwb_beca.mutex);
bce = __uwb_beca_find_bydev(rc, devaddr);
if (bce)
found = uwb_dev_try_get(rc, bce->uwb_dev);
mutex_unlock(&uwb_beca.mutex);
mutex_unlock(&rc->uwb_beca.mutex);

return found;
}
Expand All @@ -249,11 +245,11 @@ struct uwb_dev *uwb_dev_get_by_macaddr(struct uwb_rc *rc,
struct uwb_dev *found = NULL;
struct uwb_beca_e *bce;

mutex_lock(&uwb_beca.mutex);
bce = __uwb_beca_find_bymac(macaddr);
mutex_lock(&rc->uwb_beca.mutex);
bce = __uwb_beca_find_bymac(rc, macaddr);
if (bce)
found = uwb_dev_try_get(rc, bce->uwb_dev);
mutex_unlock(&uwb_beca.mutex);
mutex_unlock(&rc->uwb_beca.mutex);

return found;
}
Expand All @@ -274,7 +270,9 @@ static void uwb_beca_e_init(struct uwb_beca_e *bce)
* @bf: Beacon frame (part of b, really)
* @ts_jiffies: Timestamp (in jiffies) when the beacon was received
*/
struct uwb_beca_e *__uwb_beca_add(struct uwb_rc_evt_beacon *be,
static
struct uwb_beca_e *__uwb_beca_add(struct uwb_rc *rc,
struct uwb_rc_evt_beacon *be,
struct uwb_beacon_frame *bf,
unsigned long ts_jiffies)
{
Expand All @@ -286,7 +284,7 @@ struct uwb_beca_e *__uwb_beca_add(struct uwb_rc_evt_beacon *be,
uwb_beca_e_init(bce);
bce->ts_jiffies = ts_jiffies;
bce->uwb_dev = NULL;
list_add(&bce->node, &uwb_beca.list);
list_add(&bce->node, &rc->uwb_beca.list);
return bce;
}

Expand All @@ -295,33 +293,34 @@ struct uwb_beca_e *__uwb_beca_add(struct uwb_rc_evt_beacon *be,
*
* Remove associated devicest too.
*/
void uwb_beca_purge(void)
void uwb_beca_purge(struct uwb_rc *rc)
{
struct uwb_beca_e *bce, *next;
unsigned long expires;

mutex_lock(&uwb_beca.mutex);
list_for_each_entry_safe(bce, next, &uwb_beca.list, node) {
mutex_lock(&rc->uwb_beca.mutex);
list_for_each_entry_safe(bce, next, &rc->uwb_beca.list, node) {
expires = bce->ts_jiffies + msecs_to_jiffies(beacon_timeout_ms);
if (time_after(jiffies, expires)) {
uwbd_dev_offair(bce);
list_del(&bce->node);
uwb_bce_put(bce);
}
}
mutex_unlock(&uwb_beca.mutex);
mutex_unlock(&rc->uwb_beca.mutex);
}

/* Clean up the whole beacon cache. Called on shutdown */
void uwb_beca_release(void)
void uwb_beca_release(struct uwb_rc *rc)
{
struct uwb_beca_e *bce, *next;
mutex_lock(&uwb_beca.mutex);
list_for_each_entry_safe(bce, next, &uwb_beca.list, node) {

mutex_lock(&rc->uwb_beca.mutex);
list_for_each_entry_safe(bce, next, &rc->uwb_beca.list, node) {
list_del(&bce->node);
uwb_bce_put(bce);
}
mutex_unlock(&uwb_beca.mutex);
mutex_unlock(&rc->uwb_beca.mutex);
}

static void uwb_beacon_print(struct uwb_rc *rc, struct uwb_rc_evt_beacon *be,
Expand Down Expand Up @@ -437,18 +436,18 @@ int uwbd_evt_handle_rc_beacon(struct uwb_event *evt)
if (uwb_mac_addr_bcast(&bf->Device_Identifier))
return 0;

mutex_lock(&uwb_beca.mutex);
bce = __uwb_beca_find_bymac(&bf->Device_Identifier);
mutex_lock(&rc->uwb_beca.mutex);
bce = __uwb_beca_find_bymac(rc, &bf->Device_Identifier);
if (bce == NULL) {
/* Not in there, a new device is pinging */
uwb_beacon_print(evt->rc, be, bf);
bce = __uwb_beca_add(be, bf, evt->ts_jiffies);
bce = __uwb_beca_add(rc, be, bf, evt->ts_jiffies);
if (bce == NULL) {
mutex_unlock(&uwb_beca.mutex);
mutex_unlock(&rc->uwb_beca.mutex);
return -ENOMEM;
}
}
mutex_unlock(&uwb_beca.mutex);
mutex_unlock(&rc->uwb_beca.mutex);

mutex_lock(&bce->mutex);
/* purge old beacon data */
Expand Down
2 changes: 0 additions & 2 deletions trunk/drivers/uwb/driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,6 @@ static int __init uwb_subsys_init(void)
result = class_register(&uwb_rc_class);
if (result < 0)
goto error_uwb_rc_class_register;
uwbd_start();
uwb_dbg_init();
return 0;

Expand All @@ -132,7 +131,6 @@ module_init(uwb_subsys_init);
static void __exit uwb_subsys_exit(void)
{
uwb_dbg_exit();
uwbd_stop();
class_unregister(&uwb_rc_class);
uwb_est_destroy();
return;
Expand Down
21 changes: 14 additions & 7 deletions trunk/drivers/uwb/lc-rc.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@
#include <linux/etherdevice.h>
#include <linux/usb.h>

#define D_LOCAL 1
#include <linux/uwb/debug.h>
#include "uwb-internal.h"

static int uwb_rc_index_match(struct device *dev, void *data)
Expand Down Expand Up @@ -83,7 +81,6 @@ static void uwb_rc_sys_release(struct device *dev)

uwb_rc_neh_destroy(rc);
uwb_rc_ie_release(rc);
d_printf(1, dev, "freed uwb_rc %p\n", rc);
kfree(rc);
}

Expand All @@ -100,6 +97,8 @@ void uwb_rc_init(struct uwb_rc *rc)
rc->scan_type = UWB_SCAN_DISABLED;
INIT_LIST_HEAD(&rc->notifs_chain.list);
mutex_init(&rc->notifs_chain.mutex);
INIT_LIST_HEAD(&rc->uwb_beca.list);
mutex_init(&rc->uwb_beca.mutex);
uwb_drp_avail_init(rc);
uwb_rc_ie_init(rc);
uwb_rsv_init(rc);
Expand Down Expand Up @@ -250,6 +249,12 @@ int uwb_rc_add(struct uwb_rc *rc, struct device *parent_dev, void *priv)

rc->priv = priv;

init_waitqueue_head(&rc->uwbd.wq);
INIT_LIST_HEAD(&rc->uwbd.event_list);
spin_lock_init(&rc->uwbd.event_list_lock);

uwbd_start(rc);

result = rc->start(rc);
if (result < 0)
goto error_rc_start;
Expand Down Expand Up @@ -284,7 +289,7 @@ int uwb_rc_add(struct uwb_rc *rc, struct device *parent_dev, void *priv)
error_dev_add:
error_rc_setup:
rc->stop(rc);
uwbd_flush(rc);
uwbd_stop(rc);
error_rc_start:
return result;
}
Expand Down Expand Up @@ -315,16 +320,18 @@ void uwb_rc_rm(struct uwb_rc *rc)
uwb_rc_reset(rc);

rc->stop(rc);
uwbd_flush(rc);

uwbd_stop(rc);

uwb_dev_lock(&rc->uwb_dev);
rc->priv = NULL;
rc->cmd = NULL;
uwb_dev_unlock(&rc->uwb_dev);
mutex_lock(&uwb_beca.mutex);
mutex_lock(&rc->uwb_beca.mutex);
uwb_dev_for_each(rc, uwb_dev_offair_helper, NULL);
__uwb_rc_sys_rm(rc);
mutex_unlock(&uwb_beca.mutex);
mutex_unlock(&rc->uwb_beca.mutex);
uwb_beca_release(rc);
uwb_dev_rm(&rc->uwb_dev);
}
EXPORT_SYMBOL_GPL(uwb_rc_rm);
Expand Down
20 changes: 4 additions & 16 deletions trunk/drivers/uwb/uwb-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,8 @@ struct uwb_event {
};
};

extern void uwbd_start(void);
extern void uwbd_stop(void);
extern void uwbd_start(struct uwb_rc *rc);
extern void uwbd_stop(struct uwb_rc *rc);
extern struct uwb_event *uwb_event_alloc(size_t, gfp_t gfp_mask);
extern void uwbd_event_queue(struct uwb_event *);
void uwbd_flush(struct uwb_rc *rc);
Expand Down Expand Up @@ -194,15 +194,6 @@ int uwbd_evt_handle_rc_dev_addr_conflict(struct uwb_event *evt);

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
*
Expand All @@ -229,9 +220,6 @@ struct uwb_beca_e {
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)
Expand All @@ -242,8 +230,8 @@ 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);
extern void uwb_beca_purge(struct uwb_rc *rc);
extern void uwb_beca_release(struct uwb_rc *rc);

struct uwb_dev *uwb_dev_get_by_devaddr(struct uwb_rc *rc,
const struct uwb_dev_addr *devaddr);
Expand Down
Loading

0 comments on commit 9d1ab01

Please sign in to comment.