Bluetooth: btbcm: Move request/release_firmware()
authorFrederic Danis <frederic.danis@linux.intel.com>
Thu, 28 May 2015 09:25:01 +0000 (11:25 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Sat, 6 Jun 2015 05:29:56 +0000 (07:29 +0200)
Move request/release_firmware() out of btbcm_patchram().
This allows a better error management, if request_firmware() returns an
error then the controller will be used without firmware loading and 0 is
returned.
This will imply to change btbcm_patchram() to accept a firmware instead
of firmware name.

Signed-off-by: Frederic Danis <frederic.danis@linux.intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btbcm.c
drivers/bluetooth/btbcm.h
drivers/bluetooth/hci_bcm.c
drivers/bluetooth/hci_ldisc.c

index 728fce38a5a24cd6fb142f77b7a7178508d8e0c1..c7aec977662022d06400f42093d772866ed116a1 100644 (file)
@@ -89,21 +89,14 @@ int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
 }
 EXPORT_SYMBOL_GPL(btbcm_set_bdaddr);
 
-int btbcm_patchram(struct hci_dev *hdev, const char *firmware)
+int btbcm_patchram(struct hci_dev *hdev, const struct firmware *fw)
 {
        const struct hci_command_hdr *cmd;
-       const struct firmware *fw;
        const u8 *fw_ptr;
        size_t fw_size;
        struct sk_buff *skb;
        u16 opcode;
-       int err;
-
-       err = request_firmware(&fw, firmware, &hdev->dev);
-       if (err < 0) {
-               BT_INFO("%s: BCM: Patch %s not found", hdev->name, firmware);
-               return err;
-       }
+       int err = 0;
 
        /* Start Download */
        skb = __hci_cmd_sync(hdev, 0xfc2e, 0, NULL, HCI_INIT_TIMEOUT);
@@ -129,8 +122,7 @@ int btbcm_patchram(struct hci_dev *hdev, const char *firmware)
                fw_size -= sizeof(*cmd);
 
                if (fw_size < cmd->plen) {
-                       BT_ERR("%s: BCM: Patch %s is corrupted", hdev->name,
-                              firmware);
+                       BT_ERR("%s: BCM: Patch is corrupted", hdev->name);
                        err = -EINVAL;
                        goto done;
                }
@@ -156,7 +148,6 @@ int btbcm_patchram(struct hci_dev *hdev, const char *firmware)
        msleep(250);
 
 done:
-       release_firmware(fw);
        return err;
 }
 EXPORT_SYMBOL(btbcm_patchram);
@@ -265,6 +256,7 @@ static const struct {
 int btbcm_setup_patchram(struct hci_dev *hdev)
 {
        char fw_name[64];
+       const struct firmware *fw;
        u16 subver, rev, pid, vid;
        const char *hw_name = NULL;
        struct sk_buff *skb;
@@ -335,9 +327,15 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
                hw_name ? : "BCM", (subver & 0x7000) >> 13,
                (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
 
-       err = btbcm_patchram(hdev, fw_name);
-       if (err == -ENOENT)
+       err = request_firmware(&fw, fw_name, &hdev->dev);
+       if (err < 0) {
+               BT_INFO("%s: BCM: Patch %s not found", hdev->name, fw_name);
                return 0;
+       }
+
+       btbcm_patchram(hdev, fw);
+
+       release_firmware(fw);
 
        /* Reset */
        err = btbcm_reset(hdev);
index eb6ab5f9483d3b510ab6a2decfb1d694af8facb7..42f26a6c7f8184f8406b472ea40941aeaff4eb0c 100644 (file)
@@ -25,7 +25,7 @@
 
 int btbcm_check_bdaddr(struct hci_dev *hdev);
 int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
-int btbcm_patchram(struct hci_dev *hdev, const char *firmware);
+int btbcm_patchram(struct hci_dev *hdev, const struct firmware *fw);
 
 int btbcm_setup_patchram(struct hci_dev *hdev);
 int btbcm_setup_apple(struct hci_dev *hdev);
@@ -42,7 +42,7 @@ static inline int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
        return -EOPNOTSUPP;
 }
 
-static inline int btbcm_patchram(struct hci_dev *hdev, const char *firmware)
+static inline int btbcm_patchram(struct hci_dev *hdev, const struct firmware *fw)
 {
        return -EOPNOTSUPP;
 }
index 1ec0b4a5ffa64401b154f5b119afa4be89db3db2..8653d125e1079458bd97ad4a48fe35a61c4c4abc 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/skbuff.h>
+#include <linux/firmware.h>
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
index 5c9a73f026649c99a1b56d2f91d5981e29b905c9..114015d9eef45ed1373d0dc730796d8b864ff1c6 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/signal.h>
 #include <linux/ioctl.h>
 #include <linux/skbuff.h>
+#include <linux/firmware.h>
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>