int rc;
 
        ap_dev->drv = ap_drv;
-       spin_lock_bh(&ap_device_lock);
-       list_add(&ap_dev->list, &ap_device_list);
-       spin_unlock_bh(&ap_device_lock);
        rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV;
+       if (!rc) {
+               spin_lock_bh(&ap_device_lock);
+               list_add(&ap_dev->list, &ap_device_list);
+               spin_unlock_bh(&ap_device_lock);
+       }
        return rc;
 }
 
 
        ap_flush_queue(ap_dev);
        del_timer_sync(&ap_dev->timeout);
-       if (ap_drv->remove)
-               ap_drv->remove(ap_dev);
        spin_lock_bh(&ap_device_lock);
        list_del_init(&ap_dev->list);
        spin_unlock_bh(&ap_device_lock);
+       if (ap_drv->remove)
+               ap_drv->remove(ap_dev);
        spin_lock_bh(&ap_dev->lock);
        atomic_sub(ap_dev->queue_count, &ap_poll_requests);
        spin_unlock_bh(&ap_dev->lock);