aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2011-03-07 05:21:15 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2011-03-20 11:45:24 -0400
commitdd5eeb99f47d18c05efffcd247c0aa07eaa9ffaa (patch)
treeea2852c5436fab65afbebaf696a0db5b8d0dcf1e /drivers/firewire
parentd838d2c09af0820e306e3e9e31f97e873823b0b4 (diff)
firewire: core: increase default SPLIT_TIMEOUT value
The SPLIT_TIMEOUT mechanism is intended to detect requests that somehow got lost. However, when the timeout value is too low, transactions that could have been completed successfully will be cancelled. Furthermore, there are chips whose firmwares ignore the configured split timeout and send late split response; known examples are the DM1x00 (BeBoB), TCD22x0 (DICE), and some OXUF936QSE firmwares. This patch changes the default timeout to two seconds, which happens to be the default on other OSes, too. Actual lost requests are extremely rare, so there should be no practical downside to increasing the split timeout even on devices that work correctly. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire')
-rw-r--r--drivers/firewire/core-card.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c
index 3241dc4e1fc9..3c44fbc81acb 100644
--- a/drivers/firewire/core-card.c
+++ b/drivers/firewire/core-card.c
@@ -75,6 +75,13 @@ static size_t config_rom_length = 1 + 4 + 1 + 1;
75#define BIB_IRMC ((1) << 31) 75#define BIB_IRMC ((1) << 31)
76#define NODE_CAPABILITIES 0x0c0083c0 /* per IEEE 1394 clause 8.3.2.6.5.2 */ 76#define NODE_CAPABILITIES 0x0c0083c0 /* per IEEE 1394 clause 8.3.2.6.5.2 */
77 77
78/*
79 * IEEE-1394 specifies a default SPLIT_TIMEOUT value of 800 cycles (100 ms),
80 * but we have to make it longer because there are many devices whose firmware
81 * is just too slow for that.
82 */
83#define DEFAULT_SPLIT_TIMEOUT (2 * 8000)
84
78#define CANON_OUI 0x000085 85#define CANON_OUI 0x000085
79 86
80static void generate_config_rom(struct fw_card *card, __be32 *config_rom) 87static void generate_config_rom(struct fw_card *card, __be32 *config_rom)
@@ -512,10 +519,11 @@ void fw_card_initialize(struct fw_card *card,
512 card->device = device; 519 card->device = device;
513 card->current_tlabel = 0; 520 card->current_tlabel = 0;
514 card->tlabel_mask = 0; 521 card->tlabel_mask = 0;
515 card->split_timeout_hi = 0; 522 card->split_timeout_hi = DEFAULT_SPLIT_TIMEOUT / 8000;
516 card->split_timeout_lo = 800 << 19; 523 card->split_timeout_lo = (DEFAULT_SPLIT_TIMEOUT % 8000) << 19;
517 card->split_timeout_cycles = 800; 524 card->split_timeout_cycles = DEFAULT_SPLIT_TIMEOUT;
518 card->split_timeout_jiffies = DIV_ROUND_UP(HZ, 10); 525 card->split_timeout_jiffies =
526 DIV_ROUND_UP(DEFAULT_SPLIT_TIMEOUT * HZ, 8000);
519 card->color = 0; 527 card->color = 0;
520 card->broadcast_channel = BROADCAST_CHANNEL_INITIAL; 528 card->broadcast_channel = BROADCAST_CHANNEL_INITIAL;
521 529