mirror of https://gitee.com/openkylin/linux.git
Bluetooth: btusb: Consolidate code for waiting firmware download
This moves duplicated code for waiting firmware download completion to a function that can be reused. Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> Tested-by: Tedd Ho-Jeong An <tedd.an@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
d68903da4e
commit
21e31c6501
|
@ -2447,6 +2447,44 @@ static void btusb_setup_intel_newgen_get_fw_name(const struct intel_version_tlv
|
||||||
suffix);
|
suffix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int btusb_download_wait(struct hci_dev *hdev, ktime_t calltime, int msec)
|
||||||
|
{
|
||||||
|
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||||
|
ktime_t delta, rettime;
|
||||||
|
unsigned long long duration;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
set_bit(BTUSB_FIRMWARE_LOADED, &data->flags);
|
||||||
|
|
||||||
|
bt_dev_info(hdev, "Waiting for firmware download to complete");
|
||||||
|
|
||||||
|
err = wait_on_bit_timeout(&data->flags, BTUSB_DOWNLOADING,
|
||||||
|
TASK_INTERRUPTIBLE,
|
||||||
|
msecs_to_jiffies(msec));
|
||||||
|
if (err == -EINTR) {
|
||||||
|
bt_dev_err(hdev, "Firmware loading interrupted");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
bt_dev_err(hdev, "Firmware loading timeout");
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (test_bit(BTUSB_FIRMWARE_FAILED, &data->flags)) {
|
||||||
|
bt_dev_err(hdev, "Firmware loading failed");
|
||||||
|
return -ENOEXEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
rettime = ktime_get();
|
||||||
|
delta = ktime_sub(rettime, calltime);
|
||||||
|
duration = (unsigned long long)ktime_to_ns(delta) >> 10;
|
||||||
|
|
||||||
|
bt_dev_info(hdev, "Firmware loaded in %llu usecs", duration);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int btusb_intel_download_firmware_newgen(struct hci_dev *hdev,
|
static int btusb_intel_download_firmware_newgen(struct hci_dev *hdev,
|
||||||
struct intel_version_tlv *ver,
|
struct intel_version_tlv *ver,
|
||||||
u32 *boot_param)
|
u32 *boot_param)
|
||||||
|
@ -2455,6 +2493,7 @@ static int btusb_intel_download_firmware_newgen(struct hci_dev *hdev,
|
||||||
char fwname[64];
|
char fwname[64];
|
||||||
int err;
|
int err;
|
||||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||||
|
ktime_t calltime;
|
||||||
|
|
||||||
if (!ver || !boot_param)
|
if (!ver || !boot_param)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -2502,6 +2541,8 @@ static int btusb_intel_download_firmware_newgen(struct hci_dev *hdev,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
calltime = ktime_get();
|
||||||
|
|
||||||
set_bit(BTUSB_DOWNLOADING, &data->flags);
|
set_bit(BTUSB_DOWNLOADING, &data->flags);
|
||||||
|
|
||||||
/* Start firmware downloading and get boot parameter */
|
/* Start firmware downloading and get boot parameter */
|
||||||
|
@ -2522,9 +2563,6 @@ static int btusb_intel_download_firmware_newgen(struct hci_dev *hdev,
|
||||||
btintel_reset_to_bootloader(hdev);
|
btintel_reset_to_bootloader(hdev);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
set_bit(BTUSB_FIRMWARE_LOADED, &data->flags);
|
|
||||||
|
|
||||||
bt_dev_info(hdev, "Waiting for firmware download to complete");
|
|
||||||
|
|
||||||
/* Before switching the device into operational mode and with that
|
/* Before switching the device into operational mode and with that
|
||||||
* booting the loaded firmware, wait for the bootloader notification
|
* booting the loaded firmware, wait for the bootloader notification
|
||||||
|
@ -2537,26 +2575,9 @@ static int btusb_intel_download_firmware_newgen(struct hci_dev *hdev,
|
||||||
* and thus just timeout if that happens and fail the setup
|
* and thus just timeout if that happens and fail the setup
|
||||||
* of this device.
|
* of this device.
|
||||||
*/
|
*/
|
||||||
err = wait_on_bit_timeout(&data->flags, BTUSB_DOWNLOADING,
|
err = btusb_download_wait(hdev, calltime, 5000);
|
||||||
TASK_INTERRUPTIBLE,
|
if (err == -ETIMEDOUT)
|
||||||
msecs_to_jiffies(5000));
|
|
||||||
if (err == -EINTR) {
|
|
||||||
bt_dev_err(hdev, "Firmware loading interrupted");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
bt_dev_err(hdev, "Firmware loading timeout");
|
|
||||||
err = -ETIMEDOUT;
|
|
||||||
btintel_reset_to_bootloader(hdev);
|
btintel_reset_to_bootloader(hdev);
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test_bit(BTUSB_FIRMWARE_FAILED, &data->flags)) {
|
|
||||||
bt_dev_err(hdev, "Firmware loading failed");
|
|
||||||
err = -ENOEXEC;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
|
@ -2572,6 +2593,7 @@ static int btusb_intel_download_firmware(struct hci_dev *hdev,
|
||||||
char fwname[64];
|
char fwname[64];
|
||||||
int err;
|
int err;
|
||||||
struct btusb_data *data = hci_get_drvdata(hdev);
|
struct btusb_data *data = hci_get_drvdata(hdev);
|
||||||
|
ktime_t calltime;
|
||||||
|
|
||||||
if (!ver || !params)
|
if (!ver || !params)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -2676,6 +2698,8 @@ static int btusb_intel_download_firmware(struct hci_dev *hdev,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
calltime = ktime_get();
|
||||||
|
|
||||||
set_bit(BTUSB_DOWNLOADING, &data->flags);
|
set_bit(BTUSB_DOWNLOADING, &data->flags);
|
||||||
|
|
||||||
/* Start firmware downloading and get boot parameter */
|
/* Start firmware downloading and get boot parameter */
|
||||||
|
@ -2694,9 +2718,6 @@ static int btusb_intel_download_firmware(struct hci_dev *hdev,
|
||||||
btintel_reset_to_bootloader(hdev);
|
btintel_reset_to_bootloader(hdev);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
set_bit(BTUSB_FIRMWARE_LOADED, &data->flags);
|
|
||||||
|
|
||||||
bt_dev_info(hdev, "Waiting for firmware download to complete");
|
|
||||||
|
|
||||||
/* Before switching the device into operational mode and with that
|
/* Before switching the device into operational mode and with that
|
||||||
* booting the loaded firmware, wait for the bootloader notification
|
* booting the loaded firmware, wait for the bootloader notification
|
||||||
|
@ -2709,26 +2730,9 @@ static int btusb_intel_download_firmware(struct hci_dev *hdev,
|
||||||
* and thus just timeout if that happens and fail the setup
|
* and thus just timeout if that happens and fail the setup
|
||||||
* of this device.
|
* of this device.
|
||||||
*/
|
*/
|
||||||
err = wait_on_bit_timeout(&data->flags, BTUSB_DOWNLOADING,
|
err = btusb_download_wait(hdev, calltime, 5000);
|
||||||
TASK_INTERRUPTIBLE,
|
if (err == -ETIMEDOUT)
|
||||||
msecs_to_jiffies(5000));
|
|
||||||
if (err == -EINTR) {
|
|
||||||
bt_dev_err(hdev, "Firmware loading interrupted");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
bt_dev_err(hdev, "Firmware loading timeout");
|
|
||||||
err = -ETIMEDOUT;
|
|
||||||
btintel_reset_to_bootloader(hdev);
|
btintel_reset_to_bootloader(hdev);
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test_bit(BTUSB_FIRMWARE_FAILED, &data->flags)) {
|
|
||||||
bt_dev_err(hdev, "Firmware loading failed");
|
|
||||||
err = -ENOEXEC;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
|
@ -2755,8 +2759,6 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
|
||||||
*/
|
*/
|
||||||
boot_param = 0x00000000;
|
boot_param = 0x00000000;
|
||||||
|
|
||||||
calltime = ktime_get();
|
|
||||||
|
|
||||||
/* Read the Intel version information to determine if the device
|
/* Read the Intel version information to determine if the device
|
||||||
* is in bootloader mode or if it already has operational firmware
|
* is in bootloader mode or if it already has operational firmware
|
||||||
* loaded.
|
* loaded.
|
||||||
|
@ -2780,12 +2782,6 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
|
||||||
if (ver.fw_variant == 0x23)
|
if (ver.fw_variant == 0x23)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
rettime = ktime_get();
|
|
||||||
delta = ktime_sub(rettime, calltime);
|
|
||||||
duration = (unsigned long long) ktime_to_ns(delta) >> 10;
|
|
||||||
|
|
||||||
bt_dev_info(hdev, "Firmware loaded in %llu usecs", duration);
|
|
||||||
|
|
||||||
calltime = ktime_get();
|
calltime = ktime_get();
|
||||||
|
|
||||||
set_bit(BTUSB_BOOTING, &data->flags);
|
set_bit(BTUSB_BOOTING, &data->flags);
|
||||||
|
@ -2903,8 +2899,6 @@ static int btusb_setup_intel_newgen(struct hci_dev *hdev)
|
||||||
*/
|
*/
|
||||||
boot_param = 0x00000000;
|
boot_param = 0x00000000;
|
||||||
|
|
||||||
calltime = ktime_get();
|
|
||||||
|
|
||||||
/* Read the Intel version information to determine if the device
|
/* Read the Intel version information to determine if the device
|
||||||
* is in bootloader mode or if it already has operational firmware
|
* is in bootloader mode or if it already has operational firmware
|
||||||
* loaded.
|
* loaded.
|
||||||
|
@ -2928,12 +2922,6 @@ static int btusb_setup_intel_newgen(struct hci_dev *hdev)
|
||||||
if (version.img_type == 0x03)
|
if (version.img_type == 0x03)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
rettime = ktime_get();
|
|
||||||
delta = ktime_sub(rettime, calltime);
|
|
||||||
duration = (unsigned long long)ktime_to_ns(delta) >> 10;
|
|
||||||
|
|
||||||
bt_dev_info(hdev, "Firmware loaded in %llu usecs", duration);
|
|
||||||
|
|
||||||
calltime = ktime_get();
|
calltime = ktime_get();
|
||||||
|
|
||||||
set_bit(BTUSB_BOOTING, &data->flags);
|
set_bit(BTUSB_BOOTING, &data->flags);
|
||||||
|
|
Loading…
Reference in New Issue