#define NCCI2CTRL(ncci)    (((ncci) >> 24) & 0x7f)
 
 LIST_HEAD(capi_drivers);
-DEFINE_RWLOCK(capi_drivers_list_lock);
+DEFINE_MUTEX(capi_drivers_lock);
 
 static DEFINE_RWLOCK(application_lock);
 static DEFINE_MUTEX(controller_mutex);
 
 void register_capi_driver(struct capi_driver *driver)
 {
-       unsigned long flags;
-
-       write_lock_irqsave(&capi_drivers_list_lock, flags);
+       mutex_lock(&capi_drivers_lock);
        list_add_tail(&driver->list, &capi_drivers);
-       write_unlock_irqrestore(&capi_drivers_list_lock, flags);
+       mutex_unlock(&capi_drivers_lock);
 }
 
 EXPORT_SYMBOL(register_capi_driver);
 
 void unregister_capi_driver(struct capi_driver *driver)
 {
-       unsigned long flags;
-
-       write_lock_irqsave(&capi_drivers_list_lock, flags);
+       mutex_lock(&capi_drivers_lock);
        list_del(&driver->list);
-       write_unlock_irqrestore(&capi_drivers_list_lock, flags);
+       mutex_unlock(&capi_drivers_lock);
 }
 
 EXPORT_SYMBOL(unregister_capi_driver);
        struct capi_driver *driver = NULL;
        capiloaddata ldata;
        struct list_head *l;
-       unsigned long flags;
        int retval;
 
        switch (cmd) {
                cparams.irq = cdef.irq;
                cparams.cardnr = cdef.cardnr;
 
-               read_lock_irqsave(&capi_drivers_list_lock, flags);
+               mutex_lock(&capi_drivers_lock);
+
                 switch (cdef.cardtype) {
                        case AVM_CARDTYPE_B1:
                                list_for_each(l, &capi_drivers) {
                                break;
                }
                if (!driver) {
-                       read_unlock_irqrestore(&capi_drivers_list_lock, flags);
                        printk(KERN_ERR "kcapi: driver not loaded.\n");
-                       return -EIO;
-               }
-               if (!driver->add_card) {
-                       read_unlock_irqrestore(&capi_drivers_list_lock, flags);
+                       retval = -EIO;
+               } else if (!driver->add_card) {
                        printk(KERN_ERR "kcapi: driver has no add card function.\n");
-                       return -EIO;
-               }
+                       retval = -EIO;
+               } else
+                       retval = driver->add_card(driver, &cparams);
 
-               retval = driver->add_card(driver, &cparams);
-               read_unlock_irqrestore(&capi_drivers_list_lock, flags);
+               mutex_unlock(&capi_drivers_lock);
                return retval;
 
        case AVMB1_LOAD:
                cparams.cardtype = 0;
                cdef.driver[sizeof(cdef.driver)-1] = 0;
 
+               mutex_lock(&capi_drivers_lock);
+
                list_for_each(l, &capi_drivers) {
                        driver = list_entry(l, struct capi_driver, list);
                        if (strcmp(driver->name, cdef.driver) == 0)
                if (driver == NULL) {
                        printk(KERN_ERR "kcapi: driver \"%s\" not loaded.\n",
                                        cdef.driver);
-                       return -ESRCH;
-               }
-
-               if (!driver->add_card) {
+                       retval = -ESRCH;
+               } else if (!driver->add_card) {
                        printk(KERN_ERR "kcapi: driver \"%s\" has no add card function.\n", cdef.driver);
-                       return -EIO;
-               }
+                       retval = -EIO;
+               } else
+                       retval = driver->add_card(driver, &cparams);
 
-               return driver->add_card(driver, &cparams);
+               mutex_unlock(&capi_drivers_lock);
+               return retval;
        }
 
        default:
 
 // ---------------------------------------------------------------------------
 
 static void *capi_driver_start(struct seq_file *seq, loff_t *pos)
-       __acquires(&capi_drivers_list_lock)
+       __acquires(&capi_drivers_lock)
 {
-       read_lock(&capi_drivers_list_lock);
+       mutex_lock(&capi_drivers_lock);
        return seq_list_start(&capi_drivers, *pos);
 }
 
 }
 
 static void capi_driver_stop(struct seq_file *seq, void *v)
-       __releases(&capi_drivers_list_lock)
+       __releases(&capi_drivers_lock)
 {
-       read_unlock(&capi_drivers_list_lock);
+       mutex_unlock(&capi_drivers_lock);
 }
 
 static int capi_driver_show(struct seq_file *seq, void *v)