From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
To: Adam Goldman <adamg@pobox.com>
Cc: linux1394-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] firewire: core: send bus reset promptly on gap count error
Date: Wed, 7 Feb 2024 08:38:44 +0900 [thread overview]
Message-ID: <20240206233844.GA143470@workstation.local> (raw)
In-Reply-To: <ZcBwSuyYtPEqwk8Y@iguana.24-8.net>
Hi,
Thanks for the patch. I applied it to for-linus branch and will send it
for v6.8-rc4 in this week. Thanks for your long patience in the review
process.
On Sun, Feb 04, 2024 at 09:21:14PM -0800, Adam Goldman wrote:
> If we are bus manager and the bus has inconsistent gap counts, send a
> bus reset immediately instead of trying to read the root node's config
> ROM first. Otherwise, we could spend a lot of time trying to read the
> config ROM but never succeeding.
>
> This eliminates a 50+ second delay before the FireWire bus is usable after
> a newly connected device is powered on in certain circumstances.
>
> The delay occurs if a gap count inconsistency occurs, we are not the root
> node, and we become bus manager. One scenario that causes this is with a TI
> XIO2213B OHCI, the first time a Sony DSR-25 is powered on after being
> connected to the FireWire cable. In this configuration, the Linux box will
> not receive the initial PHY configuration packet sent by the DSR-25 as IRM,
> resulting in the DSR-25 having a gap count of 44 while the Linux box has a
> gap count of 63.
>
> FireWire devices have a gap count parameter, which is set to 63 on power-up
> and can be changed with a PHY configuration packet. This determines the
> duration of the subaction and arbitration gaps. For reliable communication,
> all nodes on a FireWire bus must have the same gap count.
>
> A node may have zero or more of the following roles: root node, bus manager
> (BM), isochronous resource manager (IRM), and cycle master. Unless a root
> node was forced with a PHY configuration packet, any node might become root
> node after a bus reset. Only the root node can become cycle master. If the
> root node is not cycle master capable, the BM or IRM should force a change
> of root node.
>
> After a bus reset, each node sends a self-ID packet, which contains its
> current gap count. A single bus reset does not change the gap count, but
> two bus resets in a row will set the gap count to 63. Because a consistent
> gap count is required for reliable communication, IEEE 1394a-2000 requires
> that the bus manager generate a bus reset if it detects that the gap count
> is inconsistent.
>
> When the gap count is inconsistent, build_tree() will notice this after the
> self identification process. It will set card->gap_count to the invalid
> value 0. If we become bus master, this will force bm_work() to send a bus
> reset when it performs gap count optimization.
>
> After a bus reset, there is no bus manager. We will almost always try to
> become bus manager. Once we become bus manager, we will first determine
> whether the root node is cycle master capable. Then, we will determine if
> the gap count should be changed. If either the root node or the gap count
> should be changed, we will generate a bus reset.
>
> To determine if the root node is cycle master capable, we read its
> configuration ROM. bm_work() will wait until we have finished trying to
> read the configuration ROM.
>
> However, an inconsistent gap count can make this take a long time.
> read_config_rom() will read the first few quadlets from the config ROM. Due
> to the gap count inconsistency, eventually one of the reads will time out.
> When read_config_rom() fails, fw_device_init() calls it again until
> MAX_RETRIES is reached. This takes 50+ seconds.
>
> Once we give up trying to read the configuration ROM, bm_work() will wake
> up, assume that the root node is not cycle master capable, and do a bus
> reset. Hopefully, this will resolve the gap count inconsistency.
>
> This change makes bm_work() check for an inconsistent gap count before
> waiting for the root node's configuration ROM. If the gap count is
> inconsistent, bm_work() will immediately do a bus reset. This eliminates
> the 50+ second delay and rapidly brings the bus to a working state.
>
> I considered that if the gap count is inconsistent, a PHY configuration
> packet might not be successful, so it could be desirable to skip the PHY
> configuration packet before the bus reset in this case. However, IEEE
> 1394a-2000 and IEEE 1394-2008 say that the bus manager may transmit a PHY
> configuration packet before a bus reset when correcting a gap count error.
> Since the standard endorses this, I decided it's safe to retain the PHY
> configuration packet transmission.
>
> Normally, after a topology change, we will reset the bus a maximum of 5
> times to change the root node and perform gap count optimization. However,
> if there is a gap count inconsistency, we must always generate a bus reset.
> Otherwise the gap count inconsistency will persist and communication will
> be unreliable. For that reason, if there is a gap count inconstency, we
> generate a bus reset even if we already reached the 5 reset limit.
>
> Signed-off-by: Adam Goldman <adamg@pobox.com>
> Link: https://sourceforge.net/p/linux1394/mailman/message/58727806/
> ---
Takashi Sakamoto
parent reply other threads:[~2024-02-06 23:38 UTC|newest]
Thread overview: expand[flat|nested] mbox.gz Atom feed
[parent not found: <ZcBwSuyYtPEqwk8Y@iguana.24-8.net>]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240206233844.GA143470@workstation.local \
--to=o-takashi@sakamocchi.jp \
--cc=adamg@pobox.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux1394-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox