]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
Bluetooth: btbcm: Fold Patch loading + applying into btbcm_initialize()
authorHans de Goede <hdegoede@redhat.com>
Fri, 17 Apr 2020 17:15:27 +0000 (19:15 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 22 Apr 2020 17:43:58 +0000 (19:43 +0200)
Instead of having btbcm_initialize() fill a passed in fw_name buffer
and then have its callers use that to request the firmware + load
it into the HCI, make btbcm_initialize() do this itself the first
time it is called (its get called a second time to reset the HCI
after the firmware has been loaded).

This removes some code duplication and makes it easier for further
patches in this series to try more then 1 firmware filename.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btbcm.c
drivers/bluetooth/btbcm.h
drivers/bluetooth/hci_bcm.c

index 8052a0e8dbfb28a01d39736a06dc0c331ad6ef36..c22e90a5e288f5ee3bf1d0233d05e02943c30799 100644 (file)
@@ -27,6 +27,8 @@
 #define BDADDR_BCM4345C5 (&(bdaddr_t) {{0xac, 0x1f, 0x00, 0xc5, 0x45, 0x43}})
 #define BDADDR_BCM43341B (&(bdaddr_t) {{0xac, 0x1f, 0x00, 0x1b, 0x34, 0x43}})
 
+#define BCM_FW_NAME_LEN                        64
+
 int btbcm_check_bdaddr(struct hci_dev *hdev)
 {
        struct hci_rp_read_bd_addr *bda;
@@ -408,14 +410,15 @@ static const struct bcm_subver_table bcm_usb_subver_table[] = {
        { }
 };
 
-int btbcm_initialize(struct hci_dev *hdev, char *fw_name, size_t len,
-                    bool reinit)
+int btbcm_initialize(struct hci_dev *hdev, bool *fw_load_done)
 {
        u16 subver, rev, pid, vid;
        const char *hw_name = "BCM";
        struct sk_buff *skb;
        struct hci_rp_read_local_version *ver;
        const struct bcm_subver_table *bcm_subver_table;
+       char fw_name[BCM_FW_NAME_LEN];
+       const struct firmware *fw;
        int i, err;
 
        /* Reset */
@@ -434,7 +437,7 @@ int btbcm_initialize(struct hci_dev *hdev, char *fw_name, size_t len,
        kfree_skb(skb);
 
        /* Read controller information */
-       if (!reinit) {
+       if (!(*fw_load_done)) {
                err = btbcm_read_info(hdev);
                if (err)
                        return err;
@@ -460,27 +463,42 @@ int btbcm_initialize(struct hci_dev *hdev, char *fw_name, size_t len,
                pid = get_unaligned_le16(skb->data + 3);
                kfree_skb(skb);
 
-               snprintf(fw_name, len, "brcm/%s-%4.4x-%4.4x.hcd",
+               snprintf(fw_name, BCM_FW_NAME_LEN, "brcm/%s-%4.4x-%4.4x.hcd",
                         hw_name, vid, pid);
        } else {
-               snprintf(fw_name, len, "brcm/%s.hcd", hw_name);
+               snprintf(fw_name, BCM_FW_NAME_LEN, "brcm/%s.hcd", hw_name);
        }
 
        bt_dev_info(hdev, "%s (%3.3u.%3.3u.%3.3u) build %4.4u",
                    hw_name, (subver & 0xe000) >> 13,
                    (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
 
+       if (*fw_load_done)
+               return 0;
+
+       err = request_firmware(&fw, fw_name, &hdev->dev);
+       if (err) {
+               bt_dev_info(hdev, "BCM: Patch %s not found", fw_name);
+               return 0;
+       }
+
+       err = btbcm_patchram(hdev, fw);
+       if (err)
+               bt_dev_info(hdev, "BCM: Patch failed (%d)", err);
+
+       release_firmware(fw);
+       *fw_load_done = true;
        return 0;
 }
 EXPORT_SYMBOL_GPL(btbcm_initialize);
 
 int btbcm_finalize(struct hci_dev *hdev)
 {
-       char fw_name[64];
+       bool fw_load_done = true;
        int err;
 
        /* Re-initialize */
-       err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), true);
+       err = btbcm_initialize(hdev, &fw_load_done);
        if (err)
                return err;
 
@@ -494,28 +512,20 @@ EXPORT_SYMBOL_GPL(btbcm_finalize);
 
 int btbcm_setup_patchram(struct hci_dev *hdev)
 {
-       char fw_name[64];
-       const struct firmware *fw;
+       bool fw_load_done = false;
        struct sk_buff *skb;
        int err;
 
        /* Initialize */
-       err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), false);
+       err = btbcm_initialize(hdev, &fw_load_done);
        if (err)
                return err;
 
-       err = request_firmware(&fw, fw_name, &hdev->dev);
-       if (err < 0) {
-               bt_dev_info(hdev, "BCM: Patch %s not found", fw_name);
+       if (!fw_load_done)
                goto done;
-       }
 
-       btbcm_patchram(hdev, fw);
-
-       release_firmware(fw);
-
-       /* Re-initialize */
-       err = btbcm_initialize(hdev, fw_name, sizeof(fw_name), true);
+       /* Re-initialize after loading Patch */
+       err = btbcm_initialize(hdev, &fw_load_done);
        if (err)
                return err;
 
index 014ef847a4867a41bc39355b4edc77fe758262db..8437caba421d75463d18a0c1b51fcfc4fe21cfa6 100644 (file)
@@ -62,8 +62,7 @@ int btbcm_write_pcm_int_params(struct hci_dev *hdev,
 int btbcm_setup_patchram(struct hci_dev *hdev);
 int btbcm_setup_apple(struct hci_dev *hdev);
 
-int btbcm_initialize(struct hci_dev *hdev, char *fw_name, size_t len,
-                    bool reinit);
+int btbcm_initialize(struct hci_dev *hdev, bool *fw_load_done);
 int btbcm_finalize(struct hci_dev *hdev);
 
 #else
@@ -105,8 +104,7 @@ static inline int btbcm_setup_apple(struct hci_dev *hdev)
        return 0;
 }
 
-static inline int btbcm_initialize(struct hci_dev *hdev, char *fw_name,
-                                  size_t len, bool reinit)
+static inline int btbcm_initialize(struct hci_dev *hdev, bool *fw_load_done)
 {
        return 0;
 }
index c42bf791a61b5a3e4fc386c3b785a1c282de545d..61731cb451cb7fd631b984c83345b7249cc7b49a 100644 (file)
@@ -553,8 +553,7 @@ static int bcm_flush(struct hci_uart *hu)
 static int bcm_setup(struct hci_uart *hu)
 {
        struct bcm_data *bcm = hu->priv;
-       char fw_name[64];
-       const struct firmware *fw;
+       bool fw_load_done = false;
        unsigned int speed;
        int err;
 
@@ -563,21 +562,12 @@ static int bcm_setup(struct hci_uart *hu)
        hu->hdev->set_diag = bcm_set_diag;
        hu->hdev->set_bdaddr = btbcm_set_bdaddr;
 
-       err = btbcm_initialize(hu->hdev, fw_name, sizeof(fw_name), false);
+       err = btbcm_initialize(hu->hdev, &fw_load_done);
        if (err)
                return err;
 
-       err = request_firmware(&fw, fw_name, &hu->hdev->dev);
-       if (err < 0) {
-               bt_dev_info(hu->hdev, "BCM: Patch %s not found", fw_name);
+       if (!fw_load_done)
                return 0;
-       }
-
-       err = btbcm_patchram(hu->hdev, fw);
-       if (err) {
-               bt_dev_info(hu->hdev, "BCM: Patch failed (%d)", err);
-               goto finalize;
-       }
 
        /* Init speed if any */
        if (hu->init_speed)
@@ -616,9 +606,6 @@ static int bcm_setup(struct hci_uart *hu)
                btbcm_write_pcm_int_params(hu->hdev, &params);
        }
 
-finalize:
-       release_firmware(fw);
-
        err = btbcm_finalize(hu->hdev);
        if (err)
                return err;