Bluetooth: hci_sync: Split hci_dev_open_sync
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 1 Apr 2022 23:12:27 +0000 (16:12 -0700)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 22 Jul 2022 00:15:17 +0000 (17:15 -0700)
This splits hci_dev_open_sync so each stage is handle by its own
function so it is easier to identify each stage.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/hci_sync.c

index e793305..36a5019 100644 (file)
@@ -3875,90 +3875,40 @@ static const struct {
                         "advertised, but not supported.")
 };
 
-int hci_dev_open_sync(struct hci_dev *hdev)
+/* This function handles hdev setup stage:
+ *
+ * Calls hdev->setup
+ * Setup address if HCI_QUIRK_USE_BDADDR_PROPERTY is set.
+ */
+static int hci_dev_setup_sync(struct hci_dev *hdev)
 {
        int ret = 0;
-
-       bt_dev_dbg(hdev, "");
-
-       if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) {
-               ret = -ENODEV;
-               goto done;
-       }
+       bool invalid_bdaddr;
+       size_t i;
 
        if (!hci_dev_test_flag(hdev, HCI_SETUP) &&
-           !hci_dev_test_flag(hdev, HCI_CONFIG)) {
-               /* Check for rfkill but allow the HCI setup stage to
-                * proceed (which in itself doesn't cause any RF activity).
-                */
-               if (hci_dev_test_flag(hdev, HCI_RFKILLED)) {
-                       ret = -ERFKILL;
-                       goto done;
-               }
-
-               /* Check for valid public address or a configured static
-                * random address, but let the HCI setup proceed to
-                * be able to determine if there is a public address
-                * or not.
-                *
-                * In case of user channel usage, it is not important
-                * if a public address or static random address is
-                * available.
-                *
-                * This check is only valid for BR/EDR controllers
-                * since AMP controllers do not have an address.
-                */
-               if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
-                   hdev->dev_type == HCI_PRIMARY &&
-                   !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
-                   !bacmp(&hdev->static_addr, BDADDR_ANY)) {
-                       ret = -EADDRNOTAVAIL;
-                       goto done;
-               }
-       }
-
-       if (test_bit(HCI_UP, &hdev->flags)) {
-               ret = -EALREADY;
-               goto done;
-       }
-
-       if (hdev->open(hdev)) {
-               ret = -EIO;
-               goto done;
-       }
-
-       set_bit(HCI_RUNNING, &hdev->flags);
-       hci_sock_dev_event(hdev, HCI_DEV_OPEN);
-
-       atomic_set(&hdev->cmd_cnt, 1);
-       set_bit(HCI_INIT, &hdev->flags);
-
-       if (hci_dev_test_flag(hdev, HCI_SETUP) ||
-           test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks)) {
-               bool invalid_bdaddr;
-               size_t i;
+           !test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks))
+               return 0;
 
-               hci_sock_dev_event(hdev, HCI_DEV_SETUP);
+       bt_dev_dbg(hdev, "");
 
-               if (hdev->setup)
-                       ret = hdev->setup(hdev);
+       hci_sock_dev_event(hdev, HCI_DEV_SETUP);
 
-               for (i = 0; i < ARRAY_SIZE(hci_broken_table); i++) {
-                       if (test_bit(hci_broken_table[i].quirk, &hdev->quirks))
-                               bt_dev_warn(hdev, "%s",
-                                           hci_broken_table[i].desc);
-               }
+       if (hdev->setup)
+               ret = hdev->setup(hdev);
 
-               /* The transport driver can set the quirk to mark the
-                * BD_ADDR invalid before creating the HCI device or in
-                * its setup callback.
-                */
-               invalid_bdaddr = test_bit(HCI_QUIRK_INVALID_BDADDR,
-                                         &hdev->quirks);
+       for (i = 0; i < ARRAY_SIZE(hci_broken_table); i++) {
+               if (test_bit(hci_broken_table[i].quirk, &hdev->quirks))
+                       bt_dev_warn(hdev, "%s", hci_broken_table[i].desc);
+       }
 
-               if (ret)
-                       goto setup_failed;
+       /* The transport driver can set the quirk to mark the
+        * BD_ADDR invalid before creating the HCI device or in
+        * its setup callback.
+        */
+       invalid_bdaddr = test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
 
+       if (!ret) {
                if (test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) {
                        if (!bacmp(&hdev->public_addr, BDADDR_ANY))
                                hci_dev_get_bd_addr_from_property(hdev);
@@ -3977,33 +3927,51 @@ int hci_dev_open_sync(struct hci_dev *hdev)
                                        invalid_bdaddr = false;
                        }
                }
+       }
 
-setup_failed:
-               /* The transport driver can set these quirks before
-                * creating the HCI device or in its setup callback.
-                *
-                * For the invalid BD_ADDR quirk it is possible that
-                * it becomes a valid address if the bootloader does
-                * provide it (see above).
-                *
-                * In case any of them is set, the controller has to
-                * start up as unconfigured.
-                */
-               if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) ||
-                   invalid_bdaddr)
-                       hci_dev_set_flag(hdev, HCI_UNCONFIGURED);
+       /* The transport driver can set these quirks before
+        * creating the HCI device or in its setup callback.
+        *
+        * For the invalid BD_ADDR quirk it is possible that
+        * it becomes a valid address if the bootloader does
+        * provide it (see above).
+        *
+        * In case any of them is set, the controller has to
+        * start up as unconfigured.
+        */
+       if (test_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks) ||
+           invalid_bdaddr)
+               hci_dev_set_flag(hdev, HCI_UNCONFIGURED);
 
-               /* For an unconfigured controller it is required to
-                * read at least the version information provided by
-                * the Read Local Version Information command.
-                *
-                * If the set_bdaddr driver callback is provided, then
-                * also the original Bluetooth public device address
-                * will be read using the Read BD Address command.
-                */
-               if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
-                       ret = hci_unconf_init_sync(hdev);
-       }
+       /* For an unconfigured controller it is required to
+        * read at least the version information provided by
+        * the Read Local Version Information command.
+        *
+        * If the set_bdaddr driver callback is provided, then
+        * also the original Bluetooth public device address
+        * will be read using the Read BD Address command.
+        */
+       if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED))
+               return hci_unconf_init_sync(hdev);
+
+       return ret;
+}
+
+/* This function handles hdev init stage:
+ *
+ * Calls hci_dev_setup_sync to perform setup stage
+ * Calls hci_init_sync to perform HCI command init sequence
+ */
+static int hci_dev_init_sync(struct hci_dev *hdev)
+{
+       int ret;
+
+       bt_dev_dbg(hdev, "");
+
+       atomic_set(&hdev->cmd_cnt, 1);
+       set_bit(HCI_INIT, &hdev->flags);
+
+       ret = hci_dev_setup_sync(hdev);
 
        if (hci_dev_test_flag(hdev, HCI_CONFIG)) {
                /* If public address change is configured, ensure that
@@ -4043,6 +4011,65 @@ setup_failed:
 
        clear_bit(HCI_INIT, &hdev->flags);
 
+       return ret;
+}
+
+int hci_dev_open_sync(struct hci_dev *hdev)
+{
+       int ret;
+
+       bt_dev_dbg(hdev, "");
+
+       if (hci_dev_test_flag(hdev, HCI_UNREGISTER)) {
+               ret = -ENODEV;
+               goto done;
+       }
+
+       if (!hci_dev_test_flag(hdev, HCI_SETUP) &&
+           !hci_dev_test_flag(hdev, HCI_CONFIG)) {
+               /* Check for rfkill but allow the HCI setup stage to
+                * proceed (which in itself doesn't cause any RF activity).
+                */
+               if (hci_dev_test_flag(hdev, HCI_RFKILLED)) {
+                       ret = -ERFKILL;
+                       goto done;
+               }
+
+               /* Check for valid public address or a configured static
+                * random address, but let the HCI setup proceed to
+                * be able to determine if there is a public address
+                * or not.
+                *
+                * In case of user channel usage, it is not important
+                * if a public address or static random address is
+                * available.
+                *
+                * This check is only valid for BR/EDR controllers
+                * since AMP controllers do not have an address.
+                */
+               if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
+                   hdev->dev_type == HCI_PRIMARY &&
+                   !bacmp(&hdev->bdaddr, BDADDR_ANY) &&
+                   !bacmp(&hdev->static_addr, BDADDR_ANY)) {
+                       ret = -EADDRNOTAVAIL;
+                       goto done;
+               }
+       }
+
+       if (test_bit(HCI_UP, &hdev->flags)) {
+               ret = -EALREADY;
+               goto done;
+       }
+
+       if (hdev->open(hdev)) {
+               ret = -EIO;
+               goto done;
+       }
+
+       set_bit(HCI_RUNNING, &hdev->flags);
+       hci_sock_dev_event(hdev, HCI_DEV_OPEN);
+
+       ret = hci_dev_init_sync(hdev);
        if (!ret) {
                hci_dev_hold(hdev);
                hci_dev_set_flag(hdev, HCI_RPA_EXPIRED);