#include <linux/errno.h>
#include <linux/device.h>
#include <linux/vmalloc.h>
+#include <linux/mutex.h>
#include <linux/poll.h>
#include <linux/preempt.h>
#include <linux/time.h>
{
struct fw_device *device;
struct client *client;
- unsigned long flags;
device = fw_device_get_by_devt(inode->i_rdev);
if (device == NULL)
file->private_data = client;
- spin_lock_irqsave(&device->client_list_lock, flags);
+ mutex_lock(&device->client_list_mutex);
list_add_tail(&client->link, &device->client_list);
- spin_unlock_irqrestore(&device->client_list_lock, flags);
+ mutex_unlock(&device->client_list_mutex);
return 0;
}
void (*callback)(struct client *client))
{
struct client *c;
- unsigned long flags;
-
- spin_lock_irqsave(&device->client_list_lock, flags);
+ mutex_lock(&device->client_list_mutex);
list_for_each_entry(c, &device->client_list, link)
callback(c);
-
- spin_unlock_irqrestore(&device->client_list_lock, flags);
+ mutex_unlock(&device->client_list_mutex);
}
static void
{
struct bus_reset *bus_reset;
- bus_reset = kzalloc(sizeof(*bus_reset), GFP_ATOMIC);
+ bus_reset = kzalloc(sizeof(*bus_reset), GFP_KERNEL);
if (bus_reset == NULL) {
fw_notify("Out of memory when allocating bus reset event\n");
return;
struct client *client = file->private_data;
struct event *e, *next_e;
struct client_resource *r, *next_r;
- unsigned long flags;
if (client->buffer.pages)
fw_iso_buffer_destroy(&client->buffer, client->device->card);
list_for_each_entry_safe(e, next_e, &client->event_list, link)
kfree(e);
- spin_lock_irqsave(&client->device->client_list_lock, flags);
+ mutex_lock(&client->device->client_list_mutex);
list_del(&client->link);
- spin_unlock_irqrestore(&client->device->client_list_lock, flags);
+ mutex_unlock(&client->device->client_list_mutex);
fw_device_put(client->device);
kfree(client);
#include <linux/idr.h>
#include <linux/jiffies.h>
#include <linux/string.h>
+#include <linux/mutex.h>
#include <linux/rwsem.h>
#include <linux/semaphore.h>
#include <linux/spinlock.h>
device->node = fw_node_get(node);
device->node_id = node->node_id;
device->generation = card->generation;
- spin_lock_init(&device->client_list_lock);
+ mutex_init(&device->client_list_mutex);
INIT_LIST_HEAD(&device->client_list);
/*
#include <linux/cdev.h>
#include <linux/idr.h>
#include <linux/rwsem.h>
-#include <linux/spinlock.h>
+#include <linux/mutex.h>
#include <asm/atomic.h>
enum fw_device_state {
bool cmc;
struct fw_card *card;
struct device device;
- /* to prevent deadlocks, never take this lock with card->lock held */
- spinlock_t client_list_lock;
+
+ struct mutex client_list_mutex;
struct list_head client_list;
+
u32 *config_rom;
size_t config_rom_length;
int config_rom_retries;