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

Commit ec1cce24 authored by Luiz Augusto von Dentz's avatar Luiz Augusto von Dentz Committed by Gustavo Padovan
Browse files

Bluetooth: handle priority change within quote



The quote is calculated based on the first buffer in the queue so if the
priority changes to something lower than the priority of the first skb
the quote needs to be recalculated.

Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarGustavo F. Padovan <padovan@profusion.mobi>
parent 73d80deb
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -2193,10 +2193,17 @@ static inline void hci_sched_acl(struct hci_dev *hdev)

	while (hdev->acl_cnt &&
			(chan = hci_chan_sent(hdev, ACL_LINK, &quote))) {
		while (quote-- && (skb = skb_dequeue(&chan->data_q))) {
		u32 priority = (skb_peek(&chan->data_q))->priority;
		while (quote-- && (skb = skb_peek(&chan->data_q))) {
			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
					skb->len, skb->priority);

			/* Stop if priority has changed */
			if (skb->priority < priority)
				break;

			skb = skb_dequeue(&chan->data_q);

			hci_conn_enter_active_mode(chan->conn,
						bt_cb(skb)->force_active);

@@ -2278,10 +2285,17 @@ static inline void hci_sched_le(struct hci_dev *hdev)

	cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt;
	while (cnt && (chan = hci_chan_sent(hdev, LE_LINK, &quote))) {
		while (quote-- && (skb = skb_dequeue(&chan->data_q))) {
		u32 priority = (skb_peek(&chan->data_q))->priority;
		while (quote-- && (skb = skb_peek(&chan->data_q))) {
			BT_DBG("chan %p skb %p len %d priority %u", chan, skb,
					skb->len, skb->priority);

			/* Stop if priority has changed */
			if (skb->priority < priority)
				break;

			skb = skb_dequeue(&chan->data_q);

			hci_send_frame(skb);
			hdev->le_last_tx = jiffies;