Commit fad70972 authored by Johan Hedberg's avatar Johan Hedberg Committed by Marcel Holtmann

Bluetooth: btusb: Use wait_on_bit_timeout() for BTUSB_BOOTING

The wait_on_bit_timeout() is a simpler and race-free way of waiting for
a bit to be cleared than the current code in btusb.c. This patch updates
the code to use the helper function (its btusb copy - to be later
updated to use a global one).
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent a087a98e
...@@ -1822,8 +1822,10 @@ static int btusb_recv_event_intel(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -1822,8 +1822,10 @@ static int btusb_recv_event_intel(struct hci_dev *hdev, struct sk_buff *skb)
*/ */
if (skb->len == 9 && hdr->evt == 0xff && hdr->plen == 0x07 && if (skb->len == 9 && hdr->evt == 0xff && hdr->plen == 0x07 &&
skb->data[2] == 0x02) { skb->data[2] == 0x02) {
if (test_and_clear_bit(BTUSB_BOOTING, &data->flags)) if (test_and_clear_bit(BTUSB_BOOTING, &data->flags)) {
wake_up_interruptible(&hdev->req_wait_q); smp_mb__after_atomic();
wake_up_bit(&data->flags, BTUSB_BOOTING);
}
} }
} }
...@@ -2236,33 +2238,25 @@ static int btusb_setup_intel_new(struct hci_dev *hdev) ...@@ -2236,33 +2238,25 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
/* The bootloader will not indicate when the device is ready. This /* The bootloader will not indicate when the device is ready. This
* is done by the operational firmware sending bootup notification. * is done by the operational firmware sending bootup notification.
*
* Booting into operational firmware should not take longer than
* 1 second. However if that happens, then just fail the setup
* since something went wrong.
*/ */
if (test_bit(BTUSB_BOOTING, &data->flags)) { BT_INFO("%s: Waiting for device to boot", hdev->name);
DECLARE_WAITQUEUE(wait, current);
signed long timeout;
BT_INFO("%s: Waiting for device to boot", hdev->name);
add_wait_queue(&hdev->req_wait_q, &wait);
set_current_state(TASK_INTERRUPTIBLE);
/* Booting into operational firmware should not take
* longer than 1 second. However if that happens, then
* just fail the setup since something went wrong.
*/
timeout = schedule_timeout(msecs_to_jiffies(1000));
remove_wait_queue(&hdev->req_wait_q, &wait); err = btusb_wait_on_bit_timeout(&data->flags, BTUSB_BOOTING,
msecs_to_jiffies(1000),
TASK_INTERRUPTIBLE);
if (signal_pending(current)) { if (err == 1) {
BT_ERR("%s: Device boot interrupted", hdev->name); BT_ERR("%s: Device boot interrupted", hdev->name);
return -EINTR; return -EINTR;
} }
if (!timeout) { if (err) {
BT_ERR("%s: Device boot timeout", hdev->name); BT_ERR("%s: Device boot timeout", hdev->name);
return -ETIMEDOUT; return -ETIMEDOUT;
}
} }
rettime = ktime_get(); rettime = ktime_get();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment