Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+19 −25
Original line number Diff line number Diff line
@@ -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 &&
		    skb->data[2] == 0x02) {
			if (test_and_clear_bit(BTUSB_BOOTING, &data->flags))
				wake_up_interruptible(&hdev->req_wait_q);
			if (test_and_clear_bit(BTUSB_BOOTING, &data->flags)) {
				smp_mb__after_atomic();
				wake_up_bit(&data->flags, BTUSB_BOOTING);
			}
		}
	}

@@ -2236,34 +2238,26 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)

	/* The bootloader will not indicate when the device is ready. This
	 * 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)) {
		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);
		return -EINTR;
	}

		if (!timeout) {
	if (err) {
		BT_ERR("%s: Device boot timeout", hdev->name);
		return -ETIMEDOUT;
	}
	}

	rettime = ktime_get();
	delta = ktime_sub(rettime, calltime);