summaryrefslogtreecommitdiffstats
path: root/drivers/firewire/nosy.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firewire/nosy.c')
-rw-r--r--drivers/firewire/nosy.c75
1 files changed, 29 insertions, 46 deletions
diff --git a/drivers/firewire/nosy.c b/drivers/firewire/nosy.c
index 2357e170e930..57a1100f8f4e 100644
--- a/drivers/firewire/nosy.c
+++ b/drivers/firewire/nosy.c
@@ -260,68 +260,44 @@ set_phy_reg(struct pcilynx *lynx, int addr, int val)
return 0;
}
-static void
-nosy_start_snoop(struct client *client)
-{
- spin_lock_irq(&client->lynx->client_list_lock);
- list_add_tail(&client->link, &client->lynx->client_list);
- spin_unlock_irq(&client->lynx->client_list_lock);
-}
-
-static void
-nosy_stop_snoop(struct client *client)
-{
- spin_lock_irq(&client->lynx->client_list_lock);
- list_del_init(&client->link);
- spin_unlock_irq(&client->lynx->client_list_lock);
-}
-
-static struct client *
-nosy_add_client(struct pcilynx *lynx)
+static int
+nosy_open(struct inode *inode, struct file *file)
{
+ int minor = iminor(inode);
struct client *client;
+ if (minor > MAX_MINORS || minors[minor] == NULL)
+ return -ENODEV;
+
client = kmalloc(sizeof *client, GFP_KERNEL);
+ if (client == NULL)
+ return -ENOMEM;
+
client->tcode_mask = ~0;
- client->lynx = lynx;
+ client->lynx = minors[minor];
INIT_LIST_HEAD(&client->link);
if (packet_buffer_init(&client->buffer, 128 * 1024) < 0) {
kfree(client);
- debug("Failed to allocate packet buffer\n");
- return NULL;
+ return -ENOMEM;
}
- return client;
-}
+ file->private_data = client;
-static void
-nosy_remove_client(struct client *client)
-{
- nosy_stop_snoop(client);
- packet_buffer_destroy(&client->buffer);
- kfree(client);
+ return 0;
}
static int
-nosy_open(struct inode *inode, struct file *file)
+nosy_release(struct inode *inode, struct file *file)
{
- int minor = iminor(inode);
-
- if (minor > MAX_MINORS || minors[minor] == NULL)
- return -ENODEV;
+ struct client *client = file->private_data;
- file->private_data = nosy_add_client(minors[minor]);
- if (file->private_data == NULL)
- return -ENOMEM;
- else
- return 0;
-}
+ spin_lock_irq(&client->lynx->client_list_lock);
+ list_del_init(&client->link);
+ spin_unlock_irq(&client->lynx->client_list_lock);
-static int
-nosy_release(struct inode *inode, struct file *file)
-{
- nosy_remove_client(file->private_data);
+ packet_buffer_destroy(&client->buffer);
+ kfree(client);
return 0;
}
@@ -367,17 +343,24 @@ nosy_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
return 0;
case NOSY_IOC_START:
- nosy_start_snoop(client);
+ spin_lock_irq(client_list_lock);
+ list_add_tail(&client->link, &client->lynx->client_list);
+ spin_unlock_irq(client_list_lock);
+
return 0;
case NOSY_IOC_STOP:
- nosy_stop_snoop(client);
+ spin_lock_irq(client_list_lock);
+ list_del_init(&client->link);
+ spin_unlock_irq(client_list_lock);
+
return 0;
case NOSY_IOC_FILTER:
spin_lock_irq(client_list_lock);
client->tcode_mask = arg;
spin_unlock_irq(client_list_lock);
+
return 0;
default: