tree-wide: fix a very frequent spelling mistake
[safe/jmp/linux-2.6] / drivers / uwb / uwb-debug.c
index ec1b7a4..2eecec0 100644 (file)
@@ -4,6 +4,7 @@
  *
  * Copyright (C) 2005-2006 Intel Corporation
  * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
+ * Copyright (C) 2008 Cambridge Silicon Radio Ltd.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License version
 
 #include "uwb-internal.h"
 
-void dump_bytes(struct device *dev, const void *_buf, size_t rsize)
-{
-       const char *buf = _buf;
-       char line[32];
-       size_t offset = 0;
-       int cnt, cnt2;
-       for (cnt = 0; cnt < rsize; cnt += 8) {
-               size_t rtop = rsize - cnt < 8 ? rsize - cnt : 8;
-               for (offset = cnt2 = 0; cnt2 < rtop; cnt2++) {
-                       offset += scnprintf(line + offset, sizeof(line) - offset,
-                                           "%02x ", buf[cnt + cnt2] & 0xff);
-               }
-               if (dev)
-                       dev_info(dev, "%s\n", line);
-               else
-                       printk(KERN_INFO "%s\n", line);
-       }
-}
-EXPORT_SYMBOL_GPL(dump_bytes);
-
 /*
  * Debug interface
  *
@@ -82,29 +63,21 @@ struct uwb_dbg {
        struct dentry *reservations_f;
        struct dentry *accept_f;
        struct dentry *drp_avail_f;
+       spinlock_t list_lock;
 };
 
 static struct dentry *root_dir;
 
 static void uwb_dbg_rsv_cb(struct uwb_rsv *rsv)
 {
-       struct uwb_rc *rc = rsv->rc;
-       struct device *dev = &rc->uwb_dev.dev;
-       struct uwb_dev_addr devaddr;
-       char owner[UWB_ADDR_STRSIZE], target[UWB_ADDR_STRSIZE];
-
-       uwb_dev_addr_print(owner, sizeof(owner), &rsv->owner->dev_addr);
-       if (rsv->target.type == UWB_RSV_TARGET_DEV)
-               devaddr = rsv->target.dev->dev_addr;
-       else
-               devaddr = rsv->target.devaddr;
-       uwb_dev_addr_print(target, sizeof(target), &devaddr);
+       struct uwb_dbg *dbg = rsv->pal_priv;
 
-       dev_dbg(dev, "debug: rsv %s -> %s: %s\n",
-               owner, target, uwb_rsv_state_str(rsv->state));
+       uwb_rsv_dump("debug", rsv);
 
        if (rsv->state == UWB_RSV_STATE_NONE) {
+               spin_lock(&dbg->list_lock);
                list_del(&rsv->pal_node);
+               spin_unlock(&dbg->list_lock);
                uwb_rsv_destroy(rsv);
        }
 }
@@ -128,20 +101,21 @@ static int cmd_rsv_establish(struct uwb_rc *rc,
                return -ENOMEM;
        }
 
-       rsv->owner       = &rc->uwb_dev;
-       rsv->target.type = UWB_RSV_TARGET_DEV;
-       rsv->target.dev  = target;
-       rsv->type        = cmd->type;
-       rsv->max_mas     = cmd->max_mas;
-       rsv->min_mas     = cmd->min_mas;
-       rsv->sparsity    = cmd->sparsity;
+       rsv->target.type  = UWB_RSV_TARGET_DEV;
+       rsv->target.dev   = target;
+       rsv->type         = cmd->type;
+       rsv->max_mas      = cmd->max_mas;
+       rsv->min_mas      = cmd->min_mas;
+       rsv->max_interval = cmd->max_interval;
 
        ret = uwb_rsv_establish(rsv);
        if (ret)
                uwb_rsv_destroy(rsv);
-       else
+       else {
+               spin_lock(&(rc->dbg)->list_lock);
                list_add_tail(&rsv->pal_node, &rc->dbg->rsvs);
-
+               spin_unlock(&(rc->dbg)->list_lock);
+       }
        return ret;
 }
 
@@ -151,17 +125,24 @@ static int cmd_rsv_terminate(struct uwb_rc *rc,
        struct uwb_rsv *rsv, *found = NULL;
        int i = 0;
 
+       spin_lock(&(rc->dbg)->list_lock);
+
        list_for_each_entry(rsv, &rc->dbg->rsvs, pal_node) {
                if (i == cmd->index) {
                        found = rsv;
+                       uwb_rsv_get(found);
                        break;
                }
                i++;
        }
+
+       spin_unlock(&(rc->dbg)->list_lock);
+
        if (!found)
                return -EINVAL;
 
        uwb_rsv_terminate(found);
+       uwb_rsv_put(found);
 
        return 0;
 }
@@ -191,7 +172,7 @@ static ssize_t command_write(struct file *file, const char __user *buf,
        struct uwb_rc *rc = file->private_data;
        struct uwb_dbg_cmd cmd;
        int ret = 0;
-
+       
        if (len != sizeof(struct uwb_dbg_cmd))
                return -EINVAL;
 
@@ -224,7 +205,7 @@ static ssize_t command_write(struct file *file, const char __user *buf,
        return ret < 0 ? ret : len;
 }
 
-static struct file_operations command_fops = {
+static const struct file_operations command_fops = {
        .open   = command_open,
        .write  = command_write,
        .read   = NULL,
@@ -274,7 +255,7 @@ static int reservations_open(struct inode *inode, struct file *file)
        return single_open(file, reservations_print, inode->i_private);
 }
 
-static struct file_operations reservations_fops = {
+static const struct file_operations reservations_fops = {
        .open    = reservations_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
@@ -302,7 +283,7 @@ static int drp_avail_open(struct inode *inode, struct file *file)
        return single_open(file, drp_avail_print, inode->i_private);
 }
 
-static struct file_operations drp_avail_fops = {
+static const struct file_operations drp_avail_fops = {
        .open    = drp_avail_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
@@ -325,7 +306,9 @@ static void uwb_dbg_new_rsv(struct uwb_pal *pal, struct uwb_rsv *rsv)
        struct uwb_dbg *dbg = container_of(pal, struct uwb_dbg, pal);
 
        if (dbg->accept) {
+               spin_lock(&dbg->list_lock);
                list_add_tail(&rsv->pal_node, &dbg->rsvs);
+               spin_unlock(&dbg->list_lock);
                uwb_rsv_accept(rsv, uwb_dbg_rsv_cb, dbg);
        }
 }
@@ -341,6 +324,7 @@ void uwb_dbg_add_rc(struct uwb_rc *rc)
                return;
 
        INIT_LIST_HEAD(&rc->dbg->rsvs);
+       spin_lock_init(&(rc->dbg)->list_lock);
 
        uwb_pal_init(&rc->dbg->pal);
        rc->dbg->pal.rc = rc;
@@ -407,3 +391,16 @@ void uwb_dbg_exit(void)
 {
        debugfs_remove(root_dir);
 }
+
+/**
+ * uwb_dbg_create_pal_dir - create a debugfs directory for a PAL
+ * @pal: The PAL.
+ */
+struct dentry *uwb_dbg_create_pal_dir(struct uwb_pal *pal)
+{
+       struct uwb_rc *rc = pal->rc;
+
+       if (root_dir && rc->dbg && rc->dbg->root_d && pal->name)
+               return debugfs_create_dir(pal->name, rc->dbg->root_d);
+       return NULL;
+}