#include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/mod_devicetable.h>
 #include <linux/device.h>
 #include <linux/scatterlist.h>
 #include "fw-topology.h"
 #include "fw-device.h"
 
+/*
+ * So far only bridges from Oxford Semiconductor are known to support
+ * concurrent logins. Depending on firmware, four or two concurrent logins
+ * are possible on OXFW911 and newer Oxsemi bridges.
+ *
+ * Concurrent logins are useful together with cluster filesystems.
+ */
+static int sbp2_param_exclusive_login = 1;
+module_param_named(exclusive_login, sbp2_param_exclusive_login, bool, 0644);
+MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device "
+                "(default = Y, use N for concurrent initiators)");
+
 /* I don't know why the SCSI stack doesn't define something like this... */
 typedef void (*scsi_done_fn_t)(struct scsi_cmnd *);
 
 #define MANAGEMENT_ORB_LUN(v)                  ((v))
 #define MANAGEMENT_ORB_FUNCTION(v)             ((v) << 16)
 #define MANAGEMENT_ORB_RECONNECT(v)            ((v) << 20)
-#define MANAGEMENT_ORB_EXCLUSIVE               ((1) << 28)
+#define MANAGEMENT_ORB_EXCLUSIVE(v)            ((v) ? 1 << 28 : 0)
 #define MANAGEMENT_ORB_REQUEST_FORMAT(v)       ((v) << 29)
 #define MANAGEMENT_ORB_NOTIFY                  ((1) << 31)
 
        orb->request.status_fifo.high = sd->address_handler.offset >> 32;
        orb->request.status_fifo.low  = sd->address_handler.offset;
 
-       /*
-        * FIXME: Yeah, ok this isn't elegant, we hardwire exclusive
-        * login and 1 second reconnect time.  The reconnect setting
-        * is probably fine, but the exclusive login should be an option.
-        */
        if (function == SBP2_LOGIN_REQUEST) {
                orb->request.misc |=
-                       MANAGEMENT_ORB_EXCLUSIVE |
+                       MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login) |
                        MANAGEMENT_ORB_RECONNECT(0);
        }