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

Commit a5aa7cca authored by Rupesh Tatiya's avatar Rupesh Tatiya Committed by Gerrit - the friendly Code Review server
Browse files

bluetooth: wait for during suspend URBs to finish on disconnect



URBs submitted during suspend are placed on deferred anchor and
scuttled on resume before submission. If disconnect/module unload
is called after resume, the callback function of such URBs can lead
to a page fault. Place such URBs on tx_anchor on resume.

clear HCI_RUNNING bit in disconnect so that no new URBs can be
submitted.

Change-Id: I2714ae397d96c73f80644159202dedda60fe0809
Signed-off-by: default avatarRupesh Tatiya <rtatiya@codeaurora.org>
parent e7c95927
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -2158,13 +2158,16 @@ static void btusb_disconnect(struct usb_interface *intf)
	if (!data)
		return;

	/* clear flags so that no more URBs can be submitted */
	hdev = data->hdev;
	clear_bit(HCI_RUNNING, &hdev->flags);

	/* kill all the anchored urbs on USB disconnect */
	usb_kill_anchored_urbs(&data->intr_anchor);
	usb_kill_anchored_urbs(&data->bulk_anchor);
	usb_kill_anchored_urbs(&data->isoc_anchor);
	usb_kill_anchored_urbs(&data->tx_anchor);

	hdev = data->hdev;
	usb_set_intfdata(data->intf, NULL);

	if (data->isoc)
@@ -2215,13 +2218,14 @@ static void play_deferred(struct btusb_data *data)
	int err;

	while ((urb = usb_get_from_anchor(&data->deferred))) {
		usb_unanchor_urb(urb);
		usb_anchor_urb(urb, &data->tx_anchor);
		err = usb_submit_urb(urb, GFP_ATOMIC);
		if (err < 0)
			break;

		data->tx_in_flight++;
	}
	usb_scuttle_anchored_urbs(&data->deferred);
}

static int btusb_resume(struct usb_interface *intf)