static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun)
 {
+       struct ccw_device *ccwdev;
        struct zfcp_adapter *adapter;
        struct zfcp_port *port;
        struct zfcp_unit *unit;
 
-       mutex_lock(&zfcp_data.config_mutex);
-       read_lock_irq(&zfcp_data.config_lock);
-       adapter = zfcp_get_adapter_by_busid(busid);
-       if (adapter)
-               zfcp_adapter_get(adapter);
-       read_unlock_irq(&zfcp_data.config_lock);
+       ccwdev = get_ccwdev_by_busid(&zfcp_ccw_driver, busid);
+       if (!ccwdev)
+               return;
+
+       if (ccw_device_set_online(ccwdev))
+               goto out_ccwdev;
 
+       mutex_lock(&zfcp_data.config_mutex);
+       adapter = dev_get_drvdata(&ccwdev->dev);
        if (!adapter)
-               goto out_adapter;
-       port = zfcp_port_enqueue(adapter, wwpn, 0, 0);
-       if (IS_ERR(port))
+               goto out_unlock;
+       zfcp_adapter_get(adapter);
+
+       port = zfcp_get_port_by_wwpn(adapter, wwpn);
+       if (!port)
                goto out_port;
+
+       zfcp_port_get(port);
        unit = zfcp_unit_enqueue(port, lun);
        if (IS_ERR(unit))
                goto out_unit;
        mutex_unlock(&zfcp_data.config_mutex);
-       ccw_device_set_online(adapter->ccw_device);
 
+       zfcp_erp_unit_reopen(unit, 0, "auidc_1", NULL);
        zfcp_erp_wait(adapter);
        flush_work(&unit->scsi_work);
 
        zfcp_port_put(port);
 out_port:
        zfcp_adapter_put(adapter);
-out_adapter:
+out_unlock:
        mutex_unlock(&zfcp_data.config_mutex);
+out_ccwdev:
+       put_device(&ccwdev->dev);
        return;
 }
 
 
        mutex_unlock(&zfcp_data.config_mutex);
 }
 
-static struct ccw_driver zfcp_ccw_driver = {
+struct ccw_driver zfcp_ccw_driver = {
        .owner       = THIS_MODULE,
        .name        = "zfcp",
        .ids         = zfcp_ccw_device_id,
 {
        return ccw_driver_register(&zfcp_ccw_driver);
 }
-
-/**
- * zfcp_get_adapter_by_busid - find zfcp_adapter struct
- * @busid: bus id string of zfcp adapter to find
- */
-struct zfcp_adapter *zfcp_get_adapter_by_busid(char *busid)
-{
-       struct ccw_device *ccw_device;
-       struct zfcp_adapter *adapter = NULL;
-
-       ccw_device = get_ccwdev_by_busid(&zfcp_ccw_driver, busid);
-       if (ccw_device) {
-               adapter = dev_get_drvdata(&ccw_device->dev);
-               put_device(&ccw_device->dev);
-       }
-       return adapter;
-}
 
 static struct zfcp_adapter *zfcp_cfdc_get_adapter(u32 devno)
 {
        char busid[9];
+       struct ccw_device *ccwdev;
+       struct zfcp_adapter *adapter = NULL;
+
        snprintf(busid, sizeof(busid), "0.0.%04x", devno);
-       return zfcp_get_adapter_by_busid(busid);
+       ccwdev = get_ccwdev_by_busid(&zfcp_ccw_driver, busid);
+       if (!ccwdev)
+               goto out;
+
+       adapter = dev_get_drvdata(&ccwdev->dev);
+       if (!adapter)
+               goto out_put;
+
+       zfcp_adapter_get(adapter);
+out_put:
+       put_device(&ccwdev->dev);
+out:
+       return adapter;
 }
 
 static int zfcp_cfdc_set_fsf(struct zfcp_fsf_cfdc *fsf_cfdc, int command)
 
 /* zfcp_ccw.c */
 extern int zfcp_ccw_register(void);
 extern int zfcp_ccw_priv_sch(struct zfcp_adapter *);
-extern struct zfcp_adapter *zfcp_get_adapter_by_busid(char *);
+extern struct ccw_driver zfcp_ccw_driver;
 
 /* zfcp_cfdc.c */
 extern struct miscdevice zfcp_cfdc_misc;