Commit dd5eeb99 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Stefan Richter

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: default avatarClemens Ladisch <clemens@ladisch.de>
Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
parent d838d2c0
...@@ -75,6 +75,13 @@ static size_t config_rom_length = 1 + 4 + 1 + 1; ...@@ -75,6 +75,13 @@ static size_t config_rom_length = 1 + 4 + 1 + 1;
#define BIB_IRMC ((1) << 31) #define BIB_IRMC ((1) << 31)
#define NODE_CAPABILITIES 0x0c0083c0 /* per IEEE 1394 clause 8.3.2.6.5.2 */ #define NODE_CAPABILITIES 0x0c0083c0 /* per IEEE 1394 clause 8.3.2.6.5.2 */
/*
* IEEE-1394 specifies a default SPLIT_TIMEOUT value of 800 cycles (100 ms),
* but we have to make it longer because there are many devices whose firmware
* is just too slow for that.
*/
#define DEFAULT_SPLIT_TIMEOUT (2 * 8000)
#define CANON_OUI 0x000085 #define CANON_OUI 0x000085
static void generate_config_rom(struct fw_card *card, __be32 *config_rom) static void generate_config_rom(struct fw_card *card, __be32 *config_rom)
...@@ -512,10 +519,11 @@ void fw_card_initialize(struct fw_card *card, ...@@ -512,10 +519,11 @@ void fw_card_initialize(struct fw_card *card,
card->device = device; card->device = device;
card->current_tlabel = 0; card->current_tlabel = 0;
card->tlabel_mask = 0; card->tlabel_mask = 0;
card->split_timeout_hi = 0; card->split_timeout_hi = DEFAULT_SPLIT_TIMEOUT / 8000;
card->split_timeout_lo = 800 << 19; card->split_timeout_lo = (DEFAULT_SPLIT_TIMEOUT % 8000) << 19;
card->split_timeout_cycles = 800; card->split_timeout_cycles = DEFAULT_SPLIT_TIMEOUT;
card->split_timeout_jiffies = DIV_ROUND_UP(HZ, 10); card->split_timeout_jiffies =
DIV_ROUND_UP(DEFAULT_SPLIT_TIMEOUT * HZ, 8000);
card->color = 0; card->color = 0;
card->broadcast_channel = BROADCAST_CHANNEL_INITIAL; card->broadcast_channel = BROADCAST_CHANNEL_INITIAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment