diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2008-01-19 19:25:31 -0500 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2008-01-30 16:22:26 -0500 |
commit | 14dc992aa782f8759c6d117d4322db62f62600ce (patch) | |
tree | 5f29e0420fd3a310ee86c4222bfa79c70f4d06ae /drivers/firewire/fw-sbp2.c | |
parent | 4dccd020d7ca5e673d7804cc4ff80fbf58d8a37e (diff) |
firewire: fw-sbp2: try to increase reconnect_hold (speed up reconnection)
Ask the target to grant 4 seconds instead of the standard and minimum of
1 second window after bus reset for reconnection. This accelerates
reconnection if there are more than one targets on the bus: If a login
and inquiry to one target blocks the fw-sbp2 workqueue for more than 1s
after bus reset, we now still can reconnect to the other target.
Before that, fw-sbp2's reconnect attempts would be rejected with "error
status: 0:9" (function rejected), and fw-sbp2 would finally re-login.
All those futile reconnect attemps cost extra time until the target
which needs re-login is ready for I/O again.
The reconnect timeout field in the login ORB doesn't have to be honored
by the target though. I found that we could get up to
- allegedly 32768s from an old OXFW911 firmware
- 256s from LSI bridges
- 4s from OXUF922 and OXFW912 bridges,
- 2s from TI bridges,
- only the standard 1s from Initio and Prolific bridges and from
Apple OpenFirmware in target mode.
We just try to get 4 seconds which already covers the case of a few
HDDs on the same bus quite nicely.
A minor drawback occurs in the following (rare and impractical) border
case:
- two initiators are there, initiator 1 holds an exclusive login to
a target,
- initiator 1 goes off the bus,
- target refuses login attempts from initiator 2 until reconnect_hold
seconds after bus reset.
An alternative approach to the issue at hand would be to parallelize
fw-sbp2's reconnect and login work.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Acked-by: Jarod Wilson <jwilson@redhat.com>
Diffstat (limited to 'drivers/firewire/fw-sbp2.c')
-rw-r--r-- | drivers/firewire/fw-sbp2.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index 661a5b66f661..d2fbfc6f6d8a 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
@@ -514,9 +514,10 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, | |||
514 | orb->request.status_fifo.low = lu->address_handler.offset; | 514 | orb->request.status_fifo.low = lu->address_handler.offset; |
515 | 515 | ||
516 | if (function == SBP2_LOGIN_REQUEST) { | 516 | if (function == SBP2_LOGIN_REQUEST) { |
517 | /* Ask for 2^2 == 4 seconds reconnect grace period */ | ||
517 | orb->request.misc |= | 518 | orb->request.misc |= |
518 | MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login) | | 519 | MANAGEMENT_ORB_RECONNECT(2) | |
519 | MANAGEMENT_ORB_RECONNECT(0); | 520 | MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login); |
520 | } | 521 | } |
521 | 522 | ||
522 | fw_memcpy_to_be32(&orb->request, &orb->request, sizeof(orb->request)); | 523 | fw_memcpy_to_be32(&orb->request, &orb->request, sizeof(orb->request)); |