if (!zfcp_data.gid_pn_cache)
                goto out_gid_cache;
 
-       zfcp_data.work_queue = create_singlethread_workqueue("zfcp_wq");
-
        sema_init(&zfcp_data.config_sema, 1);
        rwlock_init(&zfcp_data.config_lock);
 
                   adapter->fsf_lic_version);
 }
 
+static int zfcp_setup_adapter_work_queue(struct zfcp_adapter *adapter)
+{
+       char name[TASK_COMM_LEN];
+
+       snprintf(name, sizeof(name), "zfcp_q_%s",
+                dev_name(&adapter->ccw_device->dev));
+       adapter->work_queue = create_singlethread_workqueue(name);
+
+       if (adapter->work_queue)
+               return 0;
+       return -ENOMEM;
+}
+
+static void zfcp_destroy_adapter_work_queue(struct zfcp_adapter *adapter)
+{
+       if (adapter->work_queue)
+               destroy_workqueue(adapter->work_queue);
+       adapter->work_queue = NULL;
+
+}
+
 /**
  * zfcp_adapter_enqueue - enqueue a new adapter to the list
  * @ccw_device: pointer to the struct cc_device
        if (zfcp_adapter_debug_register(adapter))
                goto debug_register_failed;
 
+       if (zfcp_setup_adapter_work_queue(adapter))
+               goto work_queue_failed;
+
        init_waitqueue_head(&adapter->remove_wq);
        init_waitqueue_head(&adapter->erp_thread_wqh);
        init_waitqueue_head(&adapter->erp_done_wqh);
                return 0;
 
 sysfs_failed:
+       zfcp_destroy_adapter_work_queue(adapter);
+work_queue_failed:
        zfcp_adapter_debug_unregister(adapter);
 debug_register_failed:
        dev_set_drvdata(&ccw_device->dev, NULL);
        if (!retval)
                return;
 
+       zfcp_destroy_adapter_work_queue(adapter);
        zfcp_adapter_debug_unregister(adapter);
        zfcp_qdio_free(adapter);
        zfcp_free_low_mem_buffers(adapter);
 
        struct work_struct      scan_work;
        struct service_level    service_level;
        atomic_t                qdio_outb_full;    /* queue full incidents */
+       struct workqueue_struct *work_queue;
 };
 
 struct zfcp_port {
        struct kmem_cache       *qtcb_cache;
        struct kmem_cache       *sr_buffer_cache;
        struct kmem_cache       *gid_pn_cache;
-       struct workqueue_struct *work_queue;
 };
 
 /********************** ZFCP SPECIFIC DEFINES ********************************/
 
        zfcp_port_get(port);
        port->rport_task = RPORT_ADD;
 
-       if (!queue_work(zfcp_data.work_queue, &port->rport_work))
+       if (!queue_work(port->adapter->work_queue, &port->rport_work))
                zfcp_port_put(port);
 }
 
        zfcp_port_get(port);
        port->rport_task = RPORT_DEL;
 
-       if (port->rport && queue_work(zfcp_data.work_queue, &port->rport_work))
+       if (port->rport && queue_work(port->adapter->work_queue,
+                                     &port->rport_work))
                return;
 
        zfcp_port_put(port);