diff options
| -rw-r--r-- | drivers/firewire/fw-sbp2.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index 846aad8666..2c39f19a9e 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | 30 | ||
| 31 | #include <linux/kernel.h> | 31 | #include <linux/kernel.h> |
| 32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
| 33 | #include <linux/moduleparam.h> | ||
| 33 | #include <linux/mod_devicetable.h> | 34 | #include <linux/mod_devicetable.h> |
| 34 | #include <linux/device.h> | 35 | #include <linux/device.h> |
| 35 | #include <linux/scatterlist.h> | 36 | #include <linux/scatterlist.h> |
| @@ -47,6 +48,18 @@ | |||
| 47 | #include "fw-topology.h" | 48 | #include "fw-topology.h" |
| 48 | #include "fw-device.h" | 49 | #include "fw-device.h" |
| 49 | 50 | ||
| 51 | /* | ||
| 52 | * So far only bridges from Oxford Semiconductor are known to support | ||
| 53 | * concurrent logins. Depending on firmware, four or two concurrent logins | ||
| 54 | * are possible on OXFW911 and newer Oxsemi bridges. | ||
| 55 | * | ||
| 56 | * Concurrent logins are useful together with cluster filesystems. | ||
| 57 | */ | ||
| 58 | static int sbp2_param_exclusive_login = 1; | ||
| 59 | module_param_named(exclusive_login, sbp2_param_exclusive_login, bool, 0644); | ||
| 60 | MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device " | ||
| 61 | "(default = Y, use N for concurrent initiators)"); | ||
| 62 | |||
| 50 | /* I don't know why the SCSI stack doesn't define something like this... */ | 63 | /* I don't know why the SCSI stack doesn't define something like this... */ |
| 51 | typedef void (*scsi_done_fn_t)(struct scsi_cmnd *); | 64 | typedef void (*scsi_done_fn_t)(struct scsi_cmnd *); |
| 52 | 65 | ||
| @@ -155,7 +168,7 @@ struct sbp2_orb { | |||
| 155 | #define MANAGEMENT_ORB_LUN(v) ((v)) | 168 | #define MANAGEMENT_ORB_LUN(v) ((v)) |
| 156 | #define MANAGEMENT_ORB_FUNCTION(v) ((v) << 16) | 169 | #define MANAGEMENT_ORB_FUNCTION(v) ((v) << 16) |
| 157 | #define MANAGEMENT_ORB_RECONNECT(v) ((v) << 20) | 170 | #define MANAGEMENT_ORB_RECONNECT(v) ((v) << 20) |
| 158 | #define MANAGEMENT_ORB_EXCLUSIVE ((1) << 28) | 171 | #define MANAGEMENT_ORB_EXCLUSIVE(v) ((v) ? 1 << 28 : 0) |
| 159 | #define MANAGEMENT_ORB_REQUEST_FORMAT(v) ((v) << 29) | 172 | #define MANAGEMENT_ORB_REQUEST_FORMAT(v) ((v) << 29) |
| 160 | #define MANAGEMENT_ORB_NOTIFY ((1) << 31) | 173 | #define MANAGEMENT_ORB_NOTIFY ((1) << 31) |
| 161 | 174 | ||
| @@ -431,14 +444,9 @@ sbp2_send_management_orb(struct fw_unit *unit, int node_id, int generation, | |||
| 431 | orb->request.status_fifo.high = sd->address_handler.offset >> 32; | 444 | orb->request.status_fifo.high = sd->address_handler.offset >> 32; |
| 432 | orb->request.status_fifo.low = sd->address_handler.offset; | 445 | orb->request.status_fifo.low = sd->address_handler.offset; |
| 433 | 446 | ||
| 434 | /* | ||
| 435 | * FIXME: Yeah, ok this isn't elegant, we hardwire exclusive | ||
| 436 | * login and 1 second reconnect time. The reconnect setting | ||
| 437 | * is probably fine, but the exclusive login should be an option. | ||
| 438 | */ | ||
| 439 | if (function == SBP2_LOGIN_REQUEST) { | 447 | if (function == SBP2_LOGIN_REQUEST) { |
| 440 | orb->request.misc |= | 448 | orb->request.misc |= |
| 441 | MANAGEMENT_ORB_EXCLUSIVE | | 449 | MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login) | |
| 442 | MANAGEMENT_ORB_RECONNECT(0); | 450 | MANAGEMENT_ORB_RECONNECT(0); |
| 443 | } | 451 | } |
| 444 | 452 | ||
