Commit fde9836c authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files
Luiz Augusto von Dentz says:

====================
bluetooth pull request for net:

 - btusb: Always allow SCO packets for user channel
 - L2CAP: Fix L2CAP_ECRED_CONN_RSP response

* tag 'for-net-2025-02-21' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth:
  Bluetooth: L2CAP: Fix L2CAP_ECRED_CONN_RSP response
  Bluetooth: Always allow SCO packets for user channel
====================

Link: https://patch.msgid.link/20250221154941.2139043-1-luiz.dentz@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents b282c548 b25120e1
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -2102,7 +2102,8 @@ static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
		return submit_or_queue_tx_urb(hdev, urb);

	case HCI_SCODATA_PKT:
		if (hci_conn_num(hdev, SCO_LINK) < 1)
		if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
		    hci_conn_num(hdev, SCO_LINK) < 1)
			return -ENODEV;

		urb = alloc_isoc_urb(hdev, skb);
@@ -2576,7 +2577,8 @@ static int btusb_send_frame_intel(struct hci_dev *hdev, struct sk_buff *skb)
		return submit_or_queue_tx_urb(hdev, urb);

	case HCI_SCODATA_PKT:
		if (hci_conn_num(hdev, SCO_LINK) < 1)
		if (!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
		    hci_conn_num(hdev, SCO_LINK) < 1)
			return -ENODEV;

		urb = alloc_isoc_urb(hdev, skb);
+7 −2
Original line number Diff line number Diff line
@@ -632,7 +632,8 @@ void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
	    test_bit(FLAG_HOLD_HCI_CONN, &chan->flags))
		hci_conn_hold(conn->hcon);

	list_add(&chan->list, &conn->chan_l);
	/* Append to the list since the order matters for ECRED */
	list_add_tail(&chan->list, &conn->chan_l);
}

void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
@@ -3771,7 +3772,11 @@ static void l2cap_ecred_rsp_defer(struct l2cap_chan *chan, void *data)
	struct l2cap_ecred_conn_rsp *rsp_flex =
		container_of(&rsp->pdu.rsp, struct l2cap_ecred_conn_rsp, hdr);

	if (test_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags))
	/* Check if channel for outgoing connection or if it wasn't deferred
	 * since in those cases it must be skipped.
	 */
	if (test_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags) ||
	    !test_and_clear_bit(FLAG_DEFER_SETUP, &chan->flags))
		return;

	/* Reset ident so only one response is sent */