aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarod Wilson <jwilson@redhat.com>2008-03-07 01:43:31 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2008-04-18 11:55:33 -0400
commit17cff9ff871bb5081cade4f99a9e9382b9f1c01c (patch)
treef6bd2d184722b5796c1ada8a2b7790d615a6f194
parenta5fd9ec7a29202f388fc011a11cfb0101d9f9a34 (diff)
firewire: fw-sbp2: set dual-phase cycle_limit
Try to write dual-phase retry protocol limits to BUSY_TIMEOUT register. - The dual-phase retry protocol is optional to implement, and if not supported, writes to the dual-phase portion of the register will be ignored. We try to write the original 1394-1995 default here. - In the case of devices that are also SBP-3-compliant, all writes are ignored, as the register is read-only, but contains single-phase retry of 15, which is what we're trying to set for all SBP-2 device anyway, so this write attempt is safe and yields more consistent behavior for all devices. See section 8.3.2.3.5 of the 1394-1995 spec, section 6.2 of the SBP-2 spec, and section 6.4 of the SBP-3 spec for further details. Signed-off-by: Jarod Wilson <jwilson@redhat.com> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
-rw-r--r--drivers/firewire/fw-sbp2.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
index 625518792841..e99a33fcc923 100644
--- a/drivers/firewire/fw-sbp2.c
+++ b/drivers/firewire/fw-sbp2.c
@@ -173,7 +173,8 @@ struct sbp2_target {
173#define SBP2_ORB_TIMEOUT 2000U /* Timeout in ms */ 173#define SBP2_ORB_TIMEOUT 2000U /* Timeout in ms */
174#define SBP2_ORB_NULL 0x80000000 174#define SBP2_ORB_NULL 0x80000000
175#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 175#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000
176#define SBP2_RETRY_LIMIT 0xf /* 15 retries */ 176#define SBP2_RETRY_LIMIT 0xf /* 15 retries */
177#define SBP2_CYCLE_LIMIT (0xc8 << 12) /* 200 125us cycles */
177 178
178/* Unit directory keys */ 179/* Unit directory keys */
179#define SBP2_CSR_UNIT_CHARACTERISTICS 0x3a 180#define SBP2_CSR_UNIT_CHARACTERISTICS 0x3a
@@ -813,6 +814,22 @@ complete_set_busy_timeout(struct fw_card *card, int rcode,
813 complete(done); 814 complete(done);
814} 815}
815 816
817/*
818 * Write retransmit retry values into the BUSY_TIMEOUT register.
819 * - The single-phase retry protocol is supported by all SBP-2 devices, but the
820 * default retry_limit value is 0 (i.e. never retry transmission). We write a
821 * saner value after logging into the device.
822 * - The dual-phase retry protocol is optional to implement, and if not
823 * supported, writes to the dual-phase portion of the register will be
824 * ignored. We try to write the original 1394-1995 default here.
825 * - In the case of devices that are also SBP-3-compliant, all writes are
826 * ignored, as the register is read-only, but contains single-phase retry of
827 * 15, which is what we're trying to set for all SBP-2 device anyway, so this
828 * write attempt is safe and yields more consistent behavior for all devices.
829 *
830 * See section 8.3.2.3.5 of the 1394-1995 spec, section 6.2 of the SBP-2 spec,
831 * and section 6.4 of the SBP-3 spec for further details.
832 */
816static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu) 833static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu)
817{ 834{
818 struct fw_device *device = fw_device(lu->tgt->unit->device.parent); 835 struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
@@ -820,8 +837,7 @@ static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu)
820 struct fw_transaction t; 837 struct fw_transaction t;
821 static __be32 busy_timeout; 838 static __be32 busy_timeout;
822 839
823 /* FIXME: we should try to set dual-phase cycle_limit too */ 840 busy_timeout = cpu_to_be32(SBP2_CYCLE_LIMIT | SBP2_RETRY_LIMIT);
824 busy_timeout = cpu_to_be32(SBP2_RETRY_LIMIT);
825 841
826 fw_send_request(device->card, &t, TCODE_WRITE_QUADLET_REQUEST, 842 fw_send_request(device->card, &t, TCODE_WRITE_QUADLET_REQUEST,
827 lu->tgt->node_id, lu->generation, device->max_speed, 843 lu->tgt->node_id, lu->generation, device->max_speed,