zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
                                tag);
        zfcp_erp_wait(adapter);
-       flush_work(&adapter->scan_work);
+       flush_work(&adapter->scan_work); /* ok to call even if nothing queued */
 
        zfcp_ccw_adapter_put(adapter);
 
        adapter->req_no = 0;
 
        zfcp_ccw_activate(cdev, 0, "ccsonl1");
+       /* scan for remote ports
+          either at the end of any successful adapter recovery
+          or only after the adapter recovery for setting a device online */
+       zfcp_fc_inverse_conditional_port_scan(adapter);
+       flush_work(&adapter->scan_work); /* ok to call even if nothing queued */
        zfcp_ccw_adapter_put(adapter);
        return 0;
 }
 
        case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
                if (result == ZFCP_ERP_SUCCEEDED) {
                        register_service_level(&adapter->service_level);
-                       queue_work(adapter->work_queue, &adapter->scan_work);
+                       zfcp_fc_conditional_port_scan(adapter);
                        queue_work(adapter->work_queue, &adapter->ns_up_work);
                } else
                        unregister_service_level(&adapter->service_level);
 
 extern int zfcp_fc_exec_bsg_job(struct fc_bsg_job *);
 extern int zfcp_fc_timeout_bsg_job(struct fc_bsg_job *);
 extern void zfcp_fc_sym_name_update(struct work_struct *);
+extern void zfcp_fc_conditional_port_scan(struct zfcp_adapter *);
+extern void zfcp_fc_inverse_conditional_port_scan(struct zfcp_adapter *);
 
 /* zfcp_fsf.c */
 extern struct kmem_cache *zfcp_fsf_qtcb_cache;
 
        [ELS_ADDR_FMT_FAB]              = 0x000000,
 };
 
+static bool no_auto_port_rescan;
+module_param_named(no_auto_port_rescan, no_auto_port_rescan, bool, 0600);
+MODULE_PARM_DESC(no_auto_port_rescan,
+                "no automatic port_rescan (default off)");
+
+void zfcp_fc_conditional_port_scan(struct zfcp_adapter *adapter)
+{
+       if (no_auto_port_rescan)
+               return;
+
+       queue_work(adapter->work_queue, &adapter->scan_work);
+}
+
+void zfcp_fc_inverse_conditional_port_scan(struct zfcp_adapter *adapter)
+{
+       if (!no_auto_port_rescan)
+               return;
+
+       queue_work(adapter->work_queue, &adapter->scan_work);
+}
+
 /**
  * zfcp_fc_post_event - post event to userspace via fc_transport
  * @work: work struct with enqueued events
                zfcp_fc_enqueue_event(fsf_req->adapter, FCH_EVT_RSCN,
                                      *(u32 *)page);
        }
-       queue_work(fsf_req->adapter->work_queue, &fsf_req->adapter->scan_work);
+       zfcp_fc_conditional_port_scan(fsf_req->adapter);
 }
 
 static void zfcp_fc_incoming_wwpn(struct zfcp_fsf_req *req, u64 wwpn)
 
                if (sr_buf->status_subtype & FSF_STATUS_READ_SUB_ACT_UPDATED)
                        zfcp_cfdc_adapter_access_changed(adapter);
                if (sr_buf->status_subtype & FSF_STATUS_READ_SUB_INCOMING_ELS)
-                       queue_work(adapter->work_queue, &adapter->scan_work);
+                       zfcp_fc_conditional_port_scan(adapter);
                break;
        case FSF_STATUS_READ_CFDC_UPDATED:
                zfcp_cfdc_adapter_access_changed(adapter);