fw: sync with latest git, step two.

add the relevant sbp2 patches.

svn path=/dists/trunk/linux-2.6/; revision=10169
This commit is contained in:
Maximilian Attems 2008-01-23 10:38:41 +00:00
parent 4a39d4777e
commit 59046bfdd8
5 changed files with 175 additions and 1 deletions

3
debian/changelog vendored
View File

@ -10,8 +10,9 @@ linux-2.6 (2.6.24~rc8-1~experimental.2) UNRELEASED; urgency=low
[ maximilian attems ]
* [amd64, i386]: Enable ACPI_SYSFS_POWER and disable ACPI_PROCFS_POWER.
* [fw] Sync with latest git-ieee1394 for sbp2 fixes.
-- maximilian attems <maks@debian.org> Tue, 22 Jan 2008 20:22:43 +0100
-- maximilian attems <maks@debian.org> Wed, 23 Jan 2008 11:35:31 +0100
linux-2.6 (2.6.24~rc8-1~experimental.1) experimental; urgency=low

View File

@ -0,0 +1,68 @@
From: Jarod Wilson <jwilson@redhat.com>
Date: Sat, 19 Jan 2008 12:15:05 +0000 (+0100)
Subject: firewire: fw-sbp2: increase login orb reply timeout, fix "failed to login"
X-Git-Url: http://git.eu.kernel.org/?p=linux%2Fkernel%2Fgit%2Fieee1394%2Flinux1394-2.6.git;a=commitdiff_plain;h=a1c0f0c7405a932a760c371afe74124bdedfe874
firewire: fw-sbp2: increase login orb reply timeout, fix "failed to login"
Increase (and rename) the login orb reply timeout value to 20s
to match that of the old firewire stack. 2s simply didn't give
many devices enough time to spin up and reply.
Fixes inability to recognize some devices.
Failure mode was "orb reply timed out"/"failed to login".
Signed-off-by: Jarod Wilson <jwilson@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> (style, comments, changelog)
---
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
index 6064c6e..05dd188 100644
--- a/drivers/firewire/fw-sbp2.c
+++ b/drivers/firewire/fw-sbp2.c
@@ -150,9 +150,16 @@ struct sbp2_target {
struct list_head lu_list;
};
-#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000
+/*
+ * Per section 7.4.8 of the SBP-2 spec, a mgt_ORB_timeout value can be
+ * provided in the config rom. A high timeout value really only matters
+ * on initial login, where we'll just use 20s rather than hassling with
+ * reading the config rom, since it really wouldn't buy us much.
+ */
+#define SBP2_LOGIN_ORB_TIMEOUT 20000 /* Timeout in ms */
#define SBP2_ORB_TIMEOUT 2000 /* Timeout in ms */
#define SBP2_ORB_NULL 0x80000000
+#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000
#define SBP2_DIRECTION_TO_MEDIA 0x0
#define SBP2_DIRECTION_FROM_MEDIA 0x1
@@ -487,6 +494,7 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
{
struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
struct sbp2_management_orb *orb;
+ unsigned int timeout;
int retval = -ENOMEM;
orb = kzalloc(sizeof(*orb), GFP_ATOMIC);
@@ -517,6 +525,9 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
orb->request.misc |=
MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login) |
MANAGEMENT_ORB_RECONNECT(0);
+ timeout = SBP2_LOGIN_ORB_TIMEOUT;
+ } else {
+ timeout = SBP2_ORB_TIMEOUT;
}
fw_memcpy_to_be32(&orb->request, &orb->request, sizeof(orb->request));
@@ -533,8 +544,7 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
sbp2_send_orb(&orb->base, lu, node_id, generation,
lu->tgt->management_agent_address);
- wait_for_completion_timeout(&orb->done,
- msecs_to_jiffies(SBP2_ORB_TIMEOUT));
+ wait_for_completion_timeout(&orb->done, msecs_to_jiffies(timeout));
retval = -EIO;
if (sbp2_cancel_orbs(lu) == 0) {

View File

@ -0,0 +1,40 @@
From: Stefan Richter <stefanr@s5r6.in-berlin.de>
Date: Sun, 20 Jan 2008 00:24:26 +0000 (+0100)
Subject: firewire: fw-sbp2: skip unnecessary logout
X-Git-Url: http://git.eu.kernel.org/?p=linux%2Fkernel%2Fgit%2Fieee1394%2Flinux1394-2.6.git;a=commitdiff_plain;h=13ddc9e12470ad4cf2dcb954a747f6d8e6a1899b
firewire: fw-sbp2: skip unnecessary logout
Don't attempt to send a logout ORB if the target was already unplugged
or had its link switched off. If two targets are attached, this
enhances the chance to quickly reconnect to the remaining target when
one target is plugged out.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Acked-by: Jarod Wilson <jwilson@redhat.com>
---
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
index 05dd188..b5e9a64 100644
--- a/drivers/firewire/fw-sbp2.c
+++ b/drivers/firewire/fw-sbp2.c
@@ -628,13 +628,17 @@ static void sbp2_release_target(struct kref *kref)
struct sbp2_logical_unit *lu, *next;
struct Scsi_Host *shost =
container_of((void *)tgt, struct Scsi_Host, hostdata[0]);
+ struct fw_device *device = fw_device(tgt->unit->device.parent);
list_for_each_entry_safe(lu, next, &tgt->lu_list, link) {
if (lu->sdev)
scsi_remove_device(lu->sdev);
- sbp2_send_management_orb(lu, tgt->node_id, lu->generation,
- SBP2_LOGOUT_REQUEST, lu->login_id, NULL);
+ if (!fw_device_is_shutdown(device))
+ sbp2_send_management_orb(lu, tgt->node_id,
+ lu->generation, SBP2_LOGOUT_REQUEST,
+ lu->login_id, NULL);
+
fw_core_remove_address_handler(&lu->address_handler);
list_del(&lu->link);
kfree(lu);

View File

@ -0,0 +1,62 @@
From: Stefan Richter <stefanr@s5r6.in-berlin.de>
Date: Sun, 20 Jan 2008 00:25:31 +0000 (+0100)
Subject: firewire: fw-sbp2: try to increase reconnect_hold (speed up reconnection)
X-Git-Url: http://git.eu.kernel.org/?p=linux%2Fkernel%2Fgit%2Fieee1394%2Flinux1394-2.6.git;a=commitdiff_plain;h=b6fdd2a6c4d905c9343153e6c385518edaaf6727
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>
---
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
index b5e9a64..21122e5 100644
--- a/drivers/firewire/fw-sbp2.c
+++ b/drivers/firewire/fw-sbp2.c
@@ -522,9 +522,10 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
orb->request.status_fifo.low = lu->address_handler.offset;
if (function == SBP2_LOGIN_REQUEST) {
+ /* Ask for 2^2 == 4 seconds reconnect grace period */
orb->request.misc |=
- MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login) |
- MANAGEMENT_ORB_RECONNECT(0);
+ MANAGEMENT_ORB_RECONNECT(2) |
+ MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login);
timeout = SBP2_LOGIN_ORB_TIMEOUT;
} else {
timeout = SBP2_ORB_TIMEOUT;

View File

@ -1,2 +1,5 @@
+ bugfix/arm/disable-ath5k.patch
+ bugfix/all/patch-2.6.24-rc8-git5
+ bugfix/all/fw-sbp2-incr-login-orb-reply-timeout.patch
+ bugfix/all/fw-sbp2-skip-unnecessary-logout.patch
+ bugfix/all/fw-sbp2-try-increase-reconnect_hold.patch