if (ipcr_index >= (impr & IMPR_PLUGS_MASK))
return -EINVAL;
+ err = fw_iso_resources_init(&c->resources, unit);
+ if (err < 0)
+ return err;
+
c->connected = false;
mutex_init(&c->mutex);
- fw_iso_resources_init(&c->resources, unit);
c->last_pcr_value = cpu_to_be32(0x80000000);
c->pcr_index = ipcr_index;
c->max_speed = (impr & IMPR_SPEED_MASK) >> IMPR_SPEED_SHIFT;
#include <linux/jiffies.h>
#include <linux/mutex.h>
#include <linux/sched.h>
+#include <linux/slab.h>
#include <linux/spinlock.h>
#include "iso-resources.h"
* If the device does not support all channel numbers, change @r->channels_mask
* after calling this function.
*/
-void fw_iso_resources_init(struct fw_iso_resources *r, struct fw_unit *unit)
+int fw_iso_resources_init(struct fw_iso_resources *r, struct fw_unit *unit)
{
+ r->buffer = kmalloc(2 * 4, GFP_KERNEL);
+ if (!r->buffer)
+ return -ENOMEM;
+
r->channels_mask = ~0uLL;
r->unit = fw_unit_get(unit);
mutex_init(&r->mutex);
r->allocated = false;
+
+ return 0;
}
/**
void fw_iso_resources_destroy(struct fw_iso_resources *r)
{
WARN_ON(r->allocated);
+ kfree(r->buffer);
mutex_destroy(&r->mutex);
fw_unit_put(r->unit);
}
unsigned int bandwidth_overhead;
int generation; /* in which allocation is valid */
bool allocated;
- __be32 buffer[2];
+ __be32 *buffer;
};
-void fw_iso_resources_init(struct fw_iso_resources *r,
- struct fw_unit *unit);
+int fw_iso_resources_init(struct fw_iso_resources *r,
+ struct fw_unit *unit);
void fw_iso_resources_destroy(struct fw_iso_resources *r);
int fw_iso_resources_allocate(struct fw_iso_resources *r,