firewire: core: code refactoring to investigate root node for bus manager
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 8 Sep 2025 01:21:07 +0000 (10:21 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 8 Sep 2025 01:26:26 +0000 (10:26 +0900)
In the middle of bm_work function, both the value of gap_count and the
state of root node are investigated. Current implementation is not a good
shape since the investigation is aligned to be flat.

This commit refactors the investigation with two large branches.

Link: https://lore.kernel.org/r/20250908012108.514698-11-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
drivers/firewire/core-card.c

index 99aa98f..b430a70 100644 (file)
@@ -294,7 +294,6 @@ static void bm_work(struct work_struct *work)
        int root_id, new_root_id, irm_id, local_id;
        int expected_gap_count, generation, grace;
        bool do_reset = false;
-       bool root_device_is_running;
        bool root_device_is_cmc;
 
        lockdep_assert_held(&card->lock);
@@ -310,8 +309,6 @@ static void bm_work(struct work_struct *work)
 
        root_node = fw_node_get(card->root_node);
        root_device = fw_node_get_device(root_node);
-       root_device_is_running = root_device &&
-                       atomic_read(&root_device->state) == FW_DEVICE_RUNNING;
        root_device_is_cmc = root_device && root_device->cmc;
 
        root_id  = root_node->node_id;
@@ -450,34 +447,35 @@ static void bm_work(struct work_struct *work)
                 * is inconsistent, so bypass the 5-reset limit.
                 */
                card->bm_retries = 0;
-       } else if (root_device == NULL) {
-               /*
-                * Either link_on is false, or we failed to read the
-                * config rom.  In either case, pick another root.
-                */
-               new_root_id = local_id;
-       } else if (!root_device_is_running) {
-               /*
-                * If we haven't probed this device yet, bail out now
-                * and let's try again once that's done.
-                */
-               spin_unlock_irq(&card->lock);
-               return;
-       } else if (root_device_is_cmc) {
-               /*
-                * We will send out a force root packet for this
-                * node as part of the gap count optimization.
-                */
-               new_root_id = root_id;
        } else {
-               /*
-                * Current root has an active link layer and we
-                * successfully read the config rom, but it's not
-                * cycle master capable.
-                */
-               new_root_id = local_id;
-       }
+               // Now investigate root node.
+               struct fw_device *root_device = fw_node_get_device(root_node);
+
+               if (root_device == NULL) {
+                       // Either link_on is false, or we failed to read the
+                       // config rom.  In either case, pick another root.
+                       new_root_id = local_id;
+               } else {
+                       bool root_device_is_running =
+                               atomic_read(&root_device->state) == FW_DEVICE_RUNNING;
 
+                       if (!root_device_is_running) {
+                               // If we haven't probed this device yet, bail out now
+                               // and let's try again once that's done.
+                               spin_unlock_irq(&card->lock);
+                               return;
+                       } else if (root_device->cmc) {
+                               // We will send out a force root packet for this
+                               // node as part of the gap count optimization.
+                               new_root_id = root_id;
+                       } else {
+                               // Current root has an active link layer and we
+                               // successfully read the config rom, but it's not
+                               // cycle master capable.
+                               new_root_id = local_id;
+                       }
+               }
+       }
  pick_me:
        /*
         * Pick a gap count from 1394a table E-1.  The table doesn't cover