Skip to content

Commit a38ff5b

Browse files
committed
Merge tag 'firewire-fixes-6.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394
Pull firewire fix from Takashi Sakamoto: "A change to accelerate the device detection step in some cases. In the self-identification step after bus-reset, all nodes in the same bus broadcast selfID packet including the value of gap count. The value is related to the cable hops between nodes, and used to calculate the subaction gap and the arbitration reset gap. When each node has the different value of the gap count, the asynchronous communication between them is unreliable, since an asynchronous transaction could be interrupted by another asynchronous transaction before completion. The gap count inconsistency can be resolved by several ways; e.g. the transfer of PHY configuration packet and generation of bus-reset. The current implementation of firewire stack can correctly detect the gap count inconsistency, however the recovery action from the inconsistency tends to be delayed after reading configuration ROM of root node. This results in the long time to probe devices in some combinations of hardware. Here the stack is changed to schedule the action as soon as possible" * tag 'firewire-fixes-6.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394: firewire: core: send bus reset promptly on gap count error
2 parents 5a7ec87 + 7ed4380 commit a38ff5b

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

drivers/firewire/core-card.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,23 @@ static void bm_work(struct work_struct *work)
429429
*/
430430
card->bm_generation = generation;
431431

432-
if (root_device == NULL) {
432+
if (card->gap_count == 0) {
433+
/*
434+
* If self IDs have inconsistent gap counts, do a
435+
* bus reset ASAP. The config rom read might never
436+
* complete, so don't wait for it. However, still
437+
* send a PHY configuration packet prior to the
438+
* bus reset. The PHY configuration packet might
439+
* fail, but 1394-2008 8.4.5.2 explicitly permits
440+
* it in this case, so it should be safe to try.
441+
*/
442+
new_root_id = local_id;
443+
/*
444+
* We must always send a bus reset if the gap count
445+
* is inconsistent, so bypass the 5-reset limit.
446+
*/
447+
card->bm_retries = 0;
448+
} else if (root_device == NULL) {
433449
/*
434450
* Either link_on is false, or we failed to read the
435451
* config rom. In either case, pick another root.

0 commit comments

Comments
 (0)