aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth/btbcm.c
diff options
context:
space:
mode:
authorFrederic Danis <frederic.danis@linux.intel.com>2015-05-28 05:25:01 -0400
committerMarcel Holtmann <marcel@holtmann.org>2015-06-06 01:29:56 -0400
commit18aeb4445aa00f6f402ba3a92a2e9ff3d13882b4 (patch)
treee1e3b2733d4fd91ec222bd45788a81da532017ab /drivers/bluetooth/btbcm.c
parent133be0264f28e59d772c6a259349ba3ee2b183b3 (diff)
Bluetooth: btbcm: Move request/release_firmware()
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>
Diffstat (limited to 'drivers/bluetooth/btbcm.c')
-rw-r--r--drivers/bluetooth/btbcm.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c
index 728fce38a5a2..c7aec9776620 100644
--- a/drivers/bluetooth/btbcm.c
+++ b/drivers/bluetooth/btbcm.c
@@ -89,21 +89,14 @@ int btbcm_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
89} 89}
90EXPORT_SYMBOL_GPL(btbcm_set_bdaddr); 90EXPORT_SYMBOL_GPL(btbcm_set_bdaddr);
91 91
92int btbcm_patchram(struct hci_dev *hdev, const char *firmware) 92int btbcm_patchram(struct hci_dev *hdev, const struct firmware *fw)
93{ 93{
94 const struct hci_command_hdr *cmd; 94 const struct hci_command_hdr *cmd;
95 const struct firmware *fw;
96 const u8 *fw_ptr; 95 const u8 *fw_ptr;
97 size_t fw_size; 96 size_t fw_size;
98 struct sk_buff *skb; 97 struct sk_buff *skb;
99 u16 opcode; 98 u16 opcode;
100 int err; 99 int err = 0;
101
102 err = request_firmware(&fw, firmware, &hdev->dev);
103 if (err < 0) {
104 BT_INFO("%s: BCM: Patch %s not found", hdev->name, firmware);
105 return err;
106 }
107 100
108 /* Start Download */ 101 /* Start Download */
109 skb = __hci_cmd_sync(hdev, 0xfc2e, 0, NULL, HCI_INIT_TIMEOUT); 102 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)
129 fw_size -= sizeof(*cmd); 122 fw_size -= sizeof(*cmd);
130 123
131 if (fw_size < cmd->plen) { 124 if (fw_size < cmd->plen) {
132 BT_ERR("%s: BCM: Patch %s is corrupted", hdev->name, 125 BT_ERR("%s: BCM: Patch is corrupted", hdev->name);
133 firmware);
134 err = -EINVAL; 126 err = -EINVAL;
135 goto done; 127 goto done;
136 } 128 }
@@ -156,7 +148,6 @@ int btbcm_patchram(struct hci_dev *hdev, const char *firmware)
156 msleep(250); 148 msleep(250);
157 149
158done: 150done:
159 release_firmware(fw);
160 return err; 151 return err;
161} 152}
162EXPORT_SYMBOL(btbcm_patchram); 153EXPORT_SYMBOL(btbcm_patchram);
@@ -265,6 +256,7 @@ static const struct {
265int btbcm_setup_patchram(struct hci_dev *hdev) 256int btbcm_setup_patchram(struct hci_dev *hdev)
266{ 257{
267 char fw_name[64]; 258 char fw_name[64];
259 const struct firmware *fw;
268 u16 subver, rev, pid, vid; 260 u16 subver, rev, pid, vid;
269 const char *hw_name = NULL; 261 const char *hw_name = NULL;
270 struct sk_buff *skb; 262 struct sk_buff *skb;
@@ -335,9 +327,15 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
335 hw_name ? : "BCM", (subver & 0x7000) >> 13, 327 hw_name ? : "BCM", (subver & 0x7000) >> 13,
336 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff); 328 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
337 329
338 err = btbcm_patchram(hdev, fw_name); 330 err = request_firmware(&fw, fw_name, &hdev->dev);
339 if (err == -ENOENT) 331 if (err < 0) {
332 BT_INFO("%s: BCM: Patch %s not found", hdev->name, fw_name);
340 return 0; 333 return 0;
334 }
335
336 btbcm_patchram(hdev, fw);
337
338 release_firmware(fw);
341 339
342 /* Reset */ 340 /* Reset */
343 err = btbcm_reset(hdev); 341 err = btbcm_reset(hdev);