diff options
author | Frederic Danis <frederic.danis@linux.intel.com> | 2015-05-28 05:25:01 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2015-06-06 01:29:56 -0400 |
commit | 18aeb4445aa00f6f402ba3a92a2e9ff3d13882b4 (patch) | |
tree | e1e3b2733d4fd91ec222bd45788a81da532017ab /drivers/bluetooth/btbcm.c | |
parent | 133be0264f28e59d772c6a259349ba3ee2b183b3 (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.c | 26 |
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 | } |
90 | EXPORT_SYMBOL_GPL(btbcm_set_bdaddr); | 90 | EXPORT_SYMBOL_GPL(btbcm_set_bdaddr); |
91 | 91 | ||
92 | int btbcm_patchram(struct hci_dev *hdev, const char *firmware) | 92 | int 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 | ||
158 | done: | 150 | done: |
159 | release_firmware(fw); | ||
160 | return err; | 151 | return err; |
161 | } | 152 | } |
162 | EXPORT_SYMBOL(btbcm_patchram); | 153 | EXPORT_SYMBOL(btbcm_patchram); |
@@ -265,6 +256,7 @@ static const struct { | |||
265 | int btbcm_setup_patchram(struct hci_dev *hdev) | 256 | int 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); |