#define DRIVER_VERSION "0.8"
static struct workqueue_struct *workqueue;
-static DEFINE_IDR(tifm_adapter_idr);
-static DEFINE_SPINLOCK(tifm_adapter_lock);
+static DEFINE_IDA(tifm_adapter_ids);
static const char *tifm_media_type_name(unsigned char type, unsigned char nt)
{
int tifm_add_adapter(struct tifm_adapter *fm)
{
- int rc;
+ int rc = ida_alloc(&tifm_adapter_ids, GFP_KERNEL);
- idr_preload(GFP_KERNEL);
- spin_lock(&tifm_adapter_lock);
- rc = idr_alloc(&tifm_adapter_idr, fm, 0, 0, GFP_NOWAIT);
- if (rc >= 0)
- fm->id = rc;
- spin_unlock(&tifm_adapter_lock);
- idr_preload_end();
if (rc < 0)
return rc;
-
+ fm->id = rc;
dev_set_name(&fm->dev, "tifm%u", fm->id);
rc = device_add(&fm->dev);
- if (rc) {
- spin_lock(&tifm_adapter_lock);
- idr_remove(&tifm_adapter_idr, fm->id);
- spin_unlock(&tifm_adapter_lock);
- }
+ if (rc)
+ ida_free(&tifm_adapter_ids, fm->id);
return rc;
}
device_unregister(&fm->sockets[cnt]->dev);
}
- spin_lock(&tifm_adapter_lock);
- idr_remove(&tifm_adapter_idr, fm->id);
- spin_unlock(&tifm_adapter_lock);
+ ida_free(&tifm_adapter_ids, fm->id);
device_del(&fm->dev);
}
EXPORT_SYMBOL(tifm_remove_adapter);