public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Bluetooth: Add PA_LINK to distinguish BIG sync and PA sync connections
@ 2025-07-10 10:52 Yang Li via B4 Relay
  2025-07-10 11:34 ` bluez.test.bot
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Yang Li via B4 Relay @ 2025-07-10 10:52 UTC (permalink / raw)
  To: Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Simon Horman
  Cc: linux-bluetooth, netdev, linux-kernel, Yang Li

From: Yang Li <yang.li@amlogic.com>

Currently, BIS_LINK is used for both BIG sync and PA sync connections,
which makes it impossible to distinguish them when searching for a PA
sync connection.

Adding PA_LINK will make the distinction clearer and simplify future
extensions for PA-related features.

Signed-off-by: Yang Li <yang.li@amlogic.com>
---
 include/net/bluetooth/hci.h      |  1 +
 include/net/bluetooth/hci_core.h | 10 +++++++---
 net/bluetooth/hci_conn.c         | 14 +++++++++-----
 net/bluetooth/hci_core.c         | 27 +++++++++++++++------------
 net/bluetooth/hci_event.c        |  7 ++++---
 net/bluetooth/hci_sync.c         | 10 +++++-----
 net/bluetooth/iso.c              |  6 ++++--
 net/bluetooth/mgmt.c             |  1 +
 8 files changed, 46 insertions(+), 30 deletions(-)

diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index 19248d326cb2..50134b48b828 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -560,6 +560,7 @@ enum {
 #define LE_LINK		0x80
 #define CIS_LINK	0x82
 #define BIS_LINK	0x83
+#define PA_LINK		0x84
 #define INVALID_LINK	0xff
 
 /* LMP features */
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 3ce1fb6f5822..2ebadd45fabb 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -1005,6 +1005,7 @@ static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
 		break;
 	case CIS_LINK:
 	case BIS_LINK:
+	case PA_LINK:
 		h->iso_num++;
 		break;
 	}
@@ -1032,6 +1033,7 @@ static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
 		break;
 	case CIS_LINK:
 	case BIS_LINK:
+	case PA_LINK:
 		h->iso_num--;
 		break;
 	}
@@ -1050,6 +1052,7 @@ static inline unsigned int hci_conn_num(struct hci_dev *hdev, __u8 type)
 		return h->sco_num;
 	case CIS_LINK:
 	case BIS_LINK:
+	case PA_LINK:
 		return h->iso_num;
 	default:
 		return 0;
@@ -1132,7 +1135,7 @@ hci_conn_hash_lookup_create_pa_sync(struct hci_dev *hdev)
 	rcu_read_lock();
 
 	list_for_each_entry_rcu(c, &h->list, list) {
-		if (c->type != BIS_LINK)
+		if (c->type != PA_LINK)
 			continue;
 
 		if (!test_bit(HCI_CONN_CREATE_PA_SYNC, &c->flags))
@@ -1327,7 +1330,7 @@ hci_conn_hash_lookup_big_sync_pend(struct hci_dev *hdev,
 	rcu_read_lock();
 
 	list_for_each_entry_rcu(c, &h->list, list) {
-		if (c->type != BIS_LINK)
+		if (c->type != PA_LINK)
 			continue;
 
 		if (handle == c->iso_qos.bcast.big && num_bis == c->num_bis) {
@@ -1397,7 +1400,7 @@ hci_conn_hash_lookup_pa_sync_handle(struct hci_dev *hdev, __u16 sync_handle)
 	rcu_read_lock();
 
 	list_for_each_entry_rcu(c, &h->list, list) {
-		if (c->type != BIS_LINK)
+		if (c->type != PA_LINK)
 			continue;
 
 		/* Ignore the listen hcon, we are looking
@@ -1996,6 +1999,7 @@ static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr,
 
 	case CIS_LINK:
 	case BIS_LINK:
+	case PA_LINK:
 		return iso_connect_ind(hdev, bdaddr, flags);
 
 	default:
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index f5cd935490ad..4042e75c33a6 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -785,7 +785,7 @@ static int hci_le_big_terminate(struct hci_dev *hdev, u8 big, struct hci_conn *c
 	d->sync_handle = conn->sync_handle;
 
 	if (test_and_clear_bit(HCI_CONN_PA_SYNC, &conn->flags)) {
-		hci_conn_hash_list_flag(hdev, find_bis, BIS_LINK,
+		hci_conn_hash_list_flag(hdev, find_bis, PA_LINK,
 					HCI_CONN_PA_SYNC, d);
 
 		if (!d->count)
@@ -914,6 +914,7 @@ static struct hci_conn *__hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t
 		break;
 	case CIS_LINK:
 	case BIS_LINK:
+	case PA_LINK:
 		if (hdev->iso_mtu)
 			/* Dedicated ISO Buffer exists */
 			break;
@@ -979,6 +980,7 @@ static struct hci_conn *__hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t
 		break;
 	case CIS_LINK:
 	case BIS_LINK:
+	case PA_LINK:
 		/* conn->src should reflect the local identity address */
 		hci_copy_identity_address(hdev, &conn->src, &conn->src_type);
 
@@ -1033,7 +1035,6 @@ static struct hci_conn *__hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t
 	}
 
 	hci_conn_init_sysfs(conn);
-
 	return conn;
 }
 
@@ -1077,6 +1078,7 @@ static void hci_conn_cleanup_child(struct hci_conn *conn, u8 reason)
 		break;
 	case CIS_LINK:
 	case BIS_LINK:
+	case PA_LINK:
 		if ((conn->state != BT_CONNECTED &&
 		    !test_bit(HCI_CONN_CREATE_CIS, &conn->flags)) ||
 		    test_bit(HCI_CONN_BIG_CREATED, &conn->flags))
@@ -1152,7 +1154,8 @@ void hci_conn_del(struct hci_conn *conn)
 	} else {
 		/* Unacked ISO frames */
 		if (conn->type == CIS_LINK ||
-		    conn->type == BIS_LINK) {
+		    conn->type == BIS_LINK ||
+		    conn->type == PA_LINK) {
 			if (hdev->iso_pkts)
 				hdev->iso_cnt += conn->sent;
 			else if (hdev->le_pkts)
@@ -2081,7 +2084,7 @@ struct hci_conn *hci_pa_create_sync(struct hci_dev *hdev, bdaddr_t *dst,
 
 	bt_dev_dbg(hdev, "dst %pMR type %d sid %d", dst, dst_type, sid);
 
-	conn = hci_conn_add_unset(hdev, BIS_LINK, dst, HCI_ROLE_SLAVE);
+	conn = hci_conn_add_unset(hdev, PA_LINK, dst, HCI_ROLE_SLAVE);
 	if (IS_ERR(conn))
 		return conn;
 
@@ -2246,7 +2249,7 @@ struct hci_conn *hci_connect_bis(struct hci_dev *hdev, bdaddr_t *dst,
 	 * the start periodic advertising and create BIG commands have
 	 * been queued
 	 */
-	hci_conn_hash_list_state(hdev, bis_mark_per_adv, BIS_LINK,
+	hci_conn_hash_list_state(hdev, bis_mark_per_adv, PA_LINK,
 				 BT_BOUND, &data);
 
 	/* Queue start periodic advertising and create BIG */
@@ -2980,6 +2983,7 @@ void hci_conn_tx_queue(struct hci_conn *conn, struct sk_buff *skb)
 	switch (conn->type) {
 	case CIS_LINK:
 	case BIS_LINK:
+	case PA_LINK:
 	case ACL_LINK:
 	case LE_LINK:
 		break;
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 42f597cb0941..d1c7becb0953 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2936,12 +2936,14 @@ int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb)
 	case HCI_ACLDATA_PKT:
 		/* Detect if ISO packet has been sent as ACL */
 		if (hci_conn_num(hdev, CIS_LINK) ||
-		    hci_conn_num(hdev, BIS_LINK)) {
+		    hci_conn_num(hdev, BIS_LINK) ||
+			hci_conn_num(hdev, PA_LINK)) {
 			__u16 handle = __le16_to_cpu(hci_acl_hdr(skb)->handle);
 			__u8 type;
 
 			type = hci_conn_lookup_type(hdev, hci_handle(handle));
-			if (type == CIS_LINK || type == BIS_LINK)
+			if (type == CIS_LINK || type == BIS_LINK ||
+			    type == PA_LINK)
 				hci_skb_pkt_type(skb) = HCI_ISODATA_PKT;
 		}
 		break;
@@ -3396,6 +3398,7 @@ static inline void hci_quote_sent(struct hci_conn *conn, int num, int *quote)
 		break;
 	case CIS_LINK:
 	case BIS_LINK:
+	case PA_LINK:
 		cnt = hdev->iso_mtu ? hdev->iso_cnt :
 			hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
 		break;
@@ -3409,7 +3412,7 @@ static inline void hci_quote_sent(struct hci_conn *conn, int num, int *quote)
 }
 
 static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
-				     __u8 type2, int *quote)
+				     int *quote)
 {
 	struct hci_conn_hash *h = &hdev->conn_hash;
 	struct hci_conn *conn = NULL, *c;
@@ -3421,7 +3424,7 @@ static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
 	rcu_read_lock();
 
 	list_for_each_entry_rcu(c, &h->list, list) {
-		if ((c->type != type && c->type != type2) ||
+		if (c->type != type ||
 		    skb_queue_empty(&c->data_q))
 			continue;
 
@@ -3625,7 +3628,7 @@ static void hci_sched_sco(struct hci_dev *hdev, __u8 type)
 	else
 		cnt = &hdev->sco_cnt;
 
-	while (*cnt && (conn = hci_low_sent(hdev, type, type, &quote))) {
+	while (*cnt && (conn = hci_low_sent(hdev, type, &quote))) {
 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
 			BT_DBG("skb %p len %d", skb, skb->len);
 			hci_send_conn_frame(hdev, conn, skb);
@@ -3744,8 +3747,8 @@ static void hci_sched_le(struct hci_dev *hdev)
 		hci_prio_recalculate(hdev, LE_LINK);
 }
 
-/* Schedule CIS */
-static void hci_sched_iso(struct hci_dev *hdev)
+/* Schedule iso */
+static void hci_sched_iso(struct hci_dev *hdev, __u8 type)
 {
 	struct hci_conn *conn;
 	struct sk_buff *skb;
@@ -3753,14 +3756,12 @@ static void hci_sched_iso(struct hci_dev *hdev)
 
 	BT_DBG("%s", hdev->name);
 
-	if (!hci_conn_num(hdev, CIS_LINK) &&
-	    !hci_conn_num(hdev, BIS_LINK))
+	if (!hci_conn_num(hdev, type))
 		return;
 
 	cnt = hdev->iso_pkts ? &hdev->iso_cnt :
 		hdev->le_pkts ? &hdev->le_cnt : &hdev->acl_cnt;
-	while (*cnt && (conn = hci_low_sent(hdev, CIS_LINK, BIS_LINK,
-					    &quote))) {
+	while (*cnt && (conn = hci_low_sent(hdev, type, &quote))) {
 		while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
 			BT_DBG("skb %p len %d", skb, skb->len);
 			hci_send_conn_frame(hdev, conn, skb);
@@ -3785,7 +3786,9 @@ static void hci_tx_work(struct work_struct *work)
 		/* Schedule queues and send stuff to HCI driver */
 		hci_sched_sco(hdev, SCO_LINK);
 		hci_sched_sco(hdev, ESCO_LINK);
-		hci_sched_iso(hdev);
+		hci_sched_iso(hdev, CIS_LINK);
+		hci_sched_iso(hdev, BIS_LINK);
+		hci_sched_iso(hdev, PA_LINK);
 		hci_sched_acl(hdev);
 		hci_sched_le(hdev);
 	}
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 2c14e9daa199..d1e77dfe9edf 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -4433,6 +4433,7 @@ static void hci_num_comp_pkts_evt(struct hci_dev *hdev, void *data,
 
 		case CIS_LINK:
 		case BIS_LINK:
+		case PA_LINK:
 			if (hdev->iso_pkts) {
 				hdev->iso_cnt += count;
 				if (hdev->iso_cnt > hdev->iso_pkts)
@@ -6378,7 +6379,7 @@ static void hci_le_pa_sync_established_evt(struct hci_dev *hdev, void *data,
 	conn->sync_handle = le16_to_cpu(ev->handle);
 	conn->sid = HCI_SID_INVALID;
 
-	mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, BIS_LINK,
+	mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, PA_LINK,
 				      &flags);
 	if (!(mask & HCI_LM_ACCEPT)) {
 		hci_le_pa_term_sync(hdev, ev->handle);
@@ -6389,7 +6390,7 @@ static void hci_le_pa_sync_established_evt(struct hci_dev *hdev, void *data,
 		goto unlock;
 
 	/* Add connection to indicate PA sync event */
-	pa_sync = hci_conn_add_unset(hdev, BIS_LINK, BDADDR_ANY,
+	pa_sync = hci_conn_add_unset(hdev, PA_LINK, BDADDR_ANY,
 				     HCI_ROLE_SLAVE);
 
 	if (IS_ERR(pa_sync))
@@ -6420,7 +6421,7 @@ static void hci_le_per_adv_report_evt(struct hci_dev *hdev, void *data,
 
 	hci_dev_lock(hdev);
 
-	mask |= hci_proto_connect_ind(hdev, BDADDR_ANY, BIS_LINK, &flags);
+	mask |= hci_proto_connect_ind(hdev, BDADDR_ANY, PA_LINK, &flags);
 	if (!(mask & HCI_LM_ACCEPT))
 		goto unlock;
 
diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
index 4ea172a26ccc..d9bb543063fa 100644
--- a/net/bluetooth/hci_sync.c
+++ b/net/bluetooth/hci_sync.c
@@ -2929,7 +2929,7 @@ static int hci_le_set_ext_scan_param_sync(struct hci_dev *hdev, u8 type,
 		if (sent) {
 			struct hci_conn *conn;
 
-			conn = hci_conn_hash_lookup_ba(hdev, BIS_LINK,
+			conn = hci_conn_hash_lookup_ba(hdev, PA_LINK,
 						       &sent->bdaddr);
 			if (conn) {
 				struct bt_iso_qos *qos = &conn->iso_qos;
@@ -5493,7 +5493,7 @@ static int hci_disconnect_sync(struct hci_dev *hdev, struct hci_conn *conn,
 {
 	struct hci_cp_disconnect cp;
 
-	if (conn->type == BIS_LINK) {
+	if (conn->type == BIS_LINK || conn->type == PA_LINK) {
 		/* This is a BIS connection, hci_conn_del will
 		 * do the necessary cleanup.
 		 */
@@ -5562,7 +5562,7 @@ static int hci_connect_cancel_sync(struct hci_dev *hdev, struct hci_conn *conn,
 		return HCI_ERROR_LOCAL_HOST_TERM;
 	}
 
-	if (conn->type == BIS_LINK) {
+	if (conn->type == BIS_LINK || conn->type == PA_LINK) {
 		/* There is no way to cancel a BIS without terminating the BIG
 		 * which is done later on connection cleanup.
 		 */
@@ -5627,7 +5627,7 @@ static int hci_reject_conn_sync(struct hci_dev *hdev, struct hci_conn *conn,
 	if (conn->type == CIS_LINK)
 		return hci_le_reject_cis_sync(hdev, conn, reason);
 
-	if (conn->type == BIS_LINK)
+	if (conn->type == BIS_LINK || conn->type == PA_LINK)
 		return -EINVAL;
 
 	if (conn->type == SCO_LINK || conn->type == ESCO_LINK)
@@ -6995,7 +6995,7 @@ static void create_pa_complete(struct hci_dev *hdev, void *data, int err)
 		goto unlock;
 
 	/* Add connection to indicate PA sync error */
-	pa_sync = hci_conn_add_unset(hdev, BIS_LINK, BDADDR_ANY,
+	pa_sync = hci_conn_add_unset(hdev, PA_LINK, BDADDR_ANY,
 				     HCI_ROLE_SLAVE);
 
 	if (IS_ERR(pa_sync))
diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c
index fc22782cbeeb..dff99de98042 100644
--- a/net/bluetooth/iso.c
+++ b/net/bluetooth/iso.c
@@ -2226,7 +2226,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
 
 static void iso_connect_cfm(struct hci_conn *hcon, __u8 status)
 {
-	if (hcon->type != CIS_LINK && hcon->type != BIS_LINK) {
+	if (hcon->type != CIS_LINK && hcon->type != BIS_LINK &&
+	    hcon->type != PA_LINK) {
 		if (hcon->type != LE_LINK)
 			return;
 
@@ -2267,7 +2268,8 @@ static void iso_connect_cfm(struct hci_conn *hcon, __u8 status)
 
 static void iso_disconn_cfm(struct hci_conn *hcon, __u8 reason)
 {
-	if (hcon->type != CIS_LINK && hcon->type != BIS_LINK)
+	if (hcon->type != CIS_LINK && hcon->type !=  BIS_LINK &&
+	    hcon->type != PA_LINK)
 		return;
 
 	BT_DBG("hcon %p reason %d", hcon, reason);
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 1485b455ade4..f90c53f7885b 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -3239,6 +3239,7 @@ static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
 	switch (link_type) {
 	case CIS_LINK:
 	case BIS_LINK:
+	case PA_LINK:
 	case LE_LINK:
 		switch (addr_type) {
 		case ADDR_LE_DEV_PUBLIC:

---
base-commit: 98b3f8ecdd57baff41dceccf4cba5edff3b9c010
change-id: 20250710-pa_link-94e292e2768e

Best regards,
-- 
Yang Li <yang.li@amlogic.com>



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* RE: Bluetooth: Add PA_LINK to distinguish BIG sync and PA sync connections
  2025-07-10 10:52 [PATCH] Bluetooth: Add PA_LINK to distinguish BIG sync and PA sync connections Yang Li via B4 Relay
@ 2025-07-10 11:34 ` bluez.test.bot
  2025-07-22  5:18 ` [PATCH] " Yang Li
  2025-07-22 14:50 ` patchwork-bot+bluetooth
  2 siblings, 0 replies; 4+ messages in thread
From: bluez.test.bot @ 2025-07-10 11:34 UTC (permalink / raw)
  To: linux-bluetooth, yang.li

[-- Attachment #1: Type: text/plain, Size: 2913 bytes --]

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=980979

---Test result---

Test Summary:
CheckPatch                    PENDING   0.37 seconds
GitLint                       PENDING   0.28 seconds
SubjectPrefix                 PASS      0.13 seconds
BuildKernel                   PASS      24.66 seconds
CheckAllWarning               PASS      27.27 seconds
CheckSparse                   WARNING   31.11 seconds
BuildKernel32                 PASS      24.39 seconds
TestRunnerSetup               PASS      474.87 seconds
TestRunner_l2cap-tester       PASS      25.52 seconds
TestRunner_iso-tester         PASS      38.54 seconds
TestRunner_bnep-tester        PASS      6.30 seconds
TestRunner_mgmt-tester        FAIL      132.28 seconds
TestRunner_rfcomm-tester      PASS      9.38 seconds
TestRunner_sco-tester         PASS      14.85 seconds
TestRunner_ioctl-tester       PASS      10.10 seconds
TestRunner_mesh-tester        FAIL      11.37 seconds
TestRunner_smp-tester         PASS      8.66 seconds
TestRunner_userchan-tester    PASS      6.24 seconds
IncrementalBuild              PENDING   0.80 seconds

Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:

##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:

##############################
Test: CheckSparse - WARNING
Desc: Run sparse tool with linux kernel
Output:
net/bluetooth/hci_core.c:85:9: warning: context imbalance in '__hci_dev_get' - different lock contexts for basic blocknet/bluetooth/hci_core.c: note: in included file (through include/linux/notifier.h, include/linux/memory_hotplug.h, include/linux/mmzone.h, include/linux/gfp.h, include/linux/xarray.h, include/linux/radix-tree.h, ...):net/bluetooth/hci_event.c: note: in included file (through include/net/bluetooth/hci_core.h):
##############################
Test: TestRunner_mgmt-tester - FAIL
Desc: Run mgmt-tester with test-runner
Output:
Total: 490, Passed: 484 (98.8%), Failed: 2, Not Run: 4

Failed Test Cases
LL Privacy - Add Device 2 (2 Devices to AL)          Failed       0.205 seconds
LL Privacy - Start Discovery 2 (Disable RL)          Failed       0.204 seconds
##############################
Test: TestRunner_mesh-tester - FAIL
Desc: Run mesh-tester with test-runner
Output:
Total: 10, Passed: 8 (80.0%), Failed: 2, Not Run: 0

Failed Test Cases
Mesh - Send cancel - 1                               Timed out    2.126 seconds
Mesh - Send cancel - 2                               Timed out    2.001 seconds
##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:



---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Bluetooth: Add PA_LINK to distinguish BIG sync and PA sync connections
  2025-07-10 10:52 [PATCH] Bluetooth: Add PA_LINK to distinguish BIG sync and PA sync connections Yang Li via B4 Relay
  2025-07-10 11:34 ` bluez.test.bot
@ 2025-07-22  5:18 ` Yang Li
  2025-07-22 14:50 ` patchwork-bot+bluetooth
  2 siblings, 0 replies; 4+ messages in thread
From: Yang Li @ 2025-07-22  5:18 UTC (permalink / raw)
  To: Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz,
	David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Simon Horman
  Cc: linux-bluetooth, netdev, linux-kernel

Hi,

Just a gentle ping regarding this patch.

Best regards,

Yang

> [ EXTERNAL EMAIL ]
>
> From: Yang Li <yang.li@amlogic.com>
>
> Currently, BIS_LINK is used for both BIG sync and PA sync connections,
> which makes it impossible to distinguish them when searching for a PA
> sync connection.
>
> Adding PA_LINK will make the distinction clearer and simplify future
> extensions for PA-related features.
>
> Signed-off-by: Yang Li <yang.li@amlogic.com>
> ---
>   include/net/bluetooth/hci.h      |  1 +
>   include/net/bluetooth/hci_core.h | 10 +++++++---
>   net/bluetooth/hci_conn.c         | 14 +++++++++-----
>   net/bluetooth/hci_core.c         | 27 +++++++++++++++------------
>   net/bluetooth/hci_event.c        |  7 ++++---
>   net/bluetooth/hci_sync.c         | 10 +++++-----
>   net/bluetooth/iso.c              |  6 ++++--
>   net/bluetooth/mgmt.c             |  1 +
>   8 files changed, 46 insertions(+), 30 deletions(-)
>
> diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
> index 19248d326cb2..50134b48b828 100644
> --- a/include/net/bluetooth/hci.h
> +++ b/include/net/bluetooth/hci.h
> @@ -560,6 +560,7 @@ enum {
>   #define LE_LINK                0x80
>   #define CIS_LINK       0x82
>   #define BIS_LINK       0x83
> +#define PA_LINK                0x84
>   #define INVALID_LINK   0xff
>
>   /* LMP features */
> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
> index 3ce1fb6f5822..2ebadd45fabb 100644
> --- a/include/net/bluetooth/hci_core.h
> +++ b/include/net/bluetooth/hci_core.h
> @@ -1005,6 +1005,7 @@ static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
>                  break;
>          case CIS_LINK:
>          case BIS_LINK:
> +       case PA_LINK:
>                  h->iso_num++;
>                  break;
>          }
> @@ -1032,6 +1033,7 @@ static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
>                  break;
>          case CIS_LINK:
>          case BIS_LINK:
> +       case PA_LINK:
>                  h->iso_num--;
>                  break;
>          }
> @@ -1050,6 +1052,7 @@ static inline unsigned int hci_conn_num(struct hci_dev *hdev, __u8 type)
>                  return h->sco_num;
>          case CIS_LINK:
>          case BIS_LINK:
> +       case PA_LINK:
>                  return h->iso_num;
>          default:
>                  return 0;
> @@ -1132,7 +1135,7 @@ hci_conn_hash_lookup_create_pa_sync(struct hci_dev *hdev)
>          rcu_read_lock();
>
>          list_for_each_entry_rcu(c, &h->list, list) {
> -               if (c->type != BIS_LINK)
> +               if (c->type != PA_LINK)
>                          continue;
>
>                  if (!test_bit(HCI_CONN_CREATE_PA_SYNC, &c->flags))
> @@ -1327,7 +1330,7 @@ hci_conn_hash_lookup_big_sync_pend(struct hci_dev *hdev,
>          rcu_read_lock();
>
>          list_for_each_entry_rcu(c, &h->list, list) {
> -               if (c->type != BIS_LINK)
> +               if (c->type != PA_LINK)
>                          continue;
>
>                  if (handle == c->iso_qos.bcast.big && num_bis == c->num_bis) {
> @@ -1397,7 +1400,7 @@ hci_conn_hash_lookup_pa_sync_handle(struct hci_dev *hdev, __u16 sync_handle)
>          rcu_read_lock();
>
>          list_for_each_entry_rcu(c, &h->list, list) {
> -               if (c->type != BIS_LINK)
> +               if (c->type != PA_LINK)
>                          continue;
>
>                  /* Ignore the listen hcon, we are looking
> @@ -1996,6 +1999,7 @@ static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr,
>
>          case CIS_LINK:
>          case BIS_LINK:
> +       case PA_LINK:
>                  return iso_connect_ind(hdev, bdaddr, flags);
>
>          default:
> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> index f5cd935490ad..4042e75c33a6 100644
> --- a/net/bluetooth/hci_conn.c
> +++ b/net/bluetooth/hci_conn.c
> @@ -785,7 +785,7 @@ static int hci_le_big_terminate(struct hci_dev *hdev, u8 big, struct hci_conn *c
>          d->sync_handle = conn->sync_handle;
>
>          if (test_and_clear_bit(HCI_CONN_PA_SYNC, &conn->flags)) {
> -               hci_conn_hash_list_flag(hdev, find_bis, BIS_LINK,
> +               hci_conn_hash_list_flag(hdev, find_bis, PA_LINK,
>                                          HCI_CONN_PA_SYNC, d);
>
>                  if (!d->count)
> @@ -914,6 +914,7 @@ static struct hci_conn *__hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t
>                  break;
>          case CIS_LINK:
>          case BIS_LINK:
> +       case PA_LINK:
>                  if (hdev->iso_mtu)
>                          /* Dedicated ISO Buffer exists */
>                          break;
> @@ -979,6 +980,7 @@ static struct hci_conn *__hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t
>                  break;
>          case CIS_LINK:
>          case BIS_LINK:
> +       case PA_LINK:
>                  /* conn->src should reflect the local identity address */
>                  hci_copy_identity_address(hdev, &conn->src, &conn->src_type);
>
> @@ -1033,7 +1035,6 @@ static struct hci_conn *__hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t
>          }
>
>          hci_conn_init_sysfs(conn);
> -
>          return conn;
>   }
>
> @@ -1077,6 +1078,7 @@ static void hci_conn_cleanup_child(struct hci_conn *conn, u8 reason)
>                  break;
>          case CIS_LINK:
>          case BIS_LINK:
> +       case PA_LINK:
>                  if ((conn->state != BT_CONNECTED &&
>                      !test_bit(HCI_CONN_CREATE_CIS, &conn->flags)) ||
>                      test_bit(HCI_CONN_BIG_CREATED, &conn->flags))
> @@ -1152,7 +1154,8 @@ void hci_conn_del(struct hci_conn *conn)
>          } else {
>                  /* Unacked ISO frames */
>                  if (conn->type == CIS_LINK ||
> -                   conn->type == BIS_LINK) {
> +                   conn->type == BIS_LINK ||
> +                   conn->type == PA_LINK) {
>                          if (hdev->iso_pkts)
>                                  hdev->iso_cnt += conn->sent;
>                          else if (hdev->le_pkts)
> @@ -2081,7 +2084,7 @@ struct hci_conn *hci_pa_create_sync(struct hci_dev *hdev, bdaddr_t *dst,
>
>          bt_dev_dbg(hdev, "dst %pMR type %d sid %d", dst, dst_type, sid);
>
> -       conn = hci_conn_add_unset(hdev, BIS_LINK, dst, HCI_ROLE_SLAVE);
> +       conn = hci_conn_add_unset(hdev, PA_LINK, dst, HCI_ROLE_SLAVE);
>          if (IS_ERR(conn))
>                  return conn;
>
> @@ -2246,7 +2249,7 @@ struct hci_conn *hci_connect_bis(struct hci_dev *hdev, bdaddr_t *dst,
>           * the start periodic advertising and create BIG commands have
>           * been queued
>           */
> -       hci_conn_hash_list_state(hdev, bis_mark_per_adv, BIS_LINK,
> +       hci_conn_hash_list_state(hdev, bis_mark_per_adv, PA_LINK,
>                                   BT_BOUND, &data);
>
>          /* Queue start periodic advertising and create BIG */
> @@ -2980,6 +2983,7 @@ void hci_conn_tx_queue(struct hci_conn *conn, struct sk_buff *skb)
>          switch (conn->type) {
>          case CIS_LINK:
>          case BIS_LINK:
> +       case PA_LINK:
>          case ACL_LINK:
>          case LE_LINK:
>                  break;
> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> index 42f597cb0941..d1c7becb0953 100644
> --- a/net/bluetooth/hci_core.c
> +++ b/net/bluetooth/hci_core.c
> @@ -2936,12 +2936,14 @@ int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb)
>          case HCI_ACLDATA_PKT:
>                  /* Detect if ISO packet has been sent as ACL */
>                  if (hci_conn_num(hdev, CIS_LINK) ||
> -                   hci_conn_num(hdev, BIS_LINK)) {
> +                   hci_conn_num(hdev, BIS_LINK) ||
> +                       hci_conn_num(hdev, PA_LINK)) {
>                          __u16 handle = __le16_to_cpu(hci_acl_hdr(skb)->handle);
>                          __u8 type;
>
>                          type = hci_conn_lookup_type(hdev, hci_handle(handle));
> -                       if (type == CIS_LINK || type == BIS_LINK)
> +                       if (type == CIS_LINK || type == BIS_LINK ||
> +                           type == PA_LINK)
>                                  hci_skb_pkt_type(skb) = HCI_ISODATA_PKT;
>                  }
>                  break;
> @@ -3396,6 +3398,7 @@ static inline void hci_quote_sent(struct hci_conn *conn, int num, int *quote)
>                  break;
>          case CIS_LINK:
>          case BIS_LINK:
> +       case PA_LINK:
>                  cnt = hdev->iso_mtu ? hdev->iso_cnt :
>                          hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt;
>                  break;
> @@ -3409,7 +3412,7 @@ static inline void hci_quote_sent(struct hci_conn *conn, int num, int *quote)
>   }
>
>   static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
> -                                    __u8 type2, int *quote)
> +                                    int *quote)
>   {
>          struct hci_conn_hash *h = &hdev->conn_hash;
>          struct hci_conn *conn = NULL, *c;
> @@ -3421,7 +3424,7 @@ static struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type,
>          rcu_read_lock();
>
>          list_for_each_entry_rcu(c, &h->list, list) {
> -               if ((c->type != type && c->type != type2) ||
> +               if (c->type != type ||
>                      skb_queue_empty(&c->data_q))
>                          continue;
>
> @@ -3625,7 +3628,7 @@ static void hci_sched_sco(struct hci_dev *hdev, __u8 type)
>          else
>                  cnt = &hdev->sco_cnt;
>
> -       while (*cnt && (conn = hci_low_sent(hdev, type, type, &quote))) {
> +       while (*cnt && (conn = hci_low_sent(hdev, type, &quote))) {
>                  while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
>                          BT_DBG("skb %p len %d", skb, skb->len);
>                          hci_send_conn_frame(hdev, conn, skb);
> @@ -3744,8 +3747,8 @@ static void hci_sched_le(struct hci_dev *hdev)
>                  hci_prio_recalculate(hdev, LE_LINK);
>   }
>
> -/* Schedule CIS */
> -static void hci_sched_iso(struct hci_dev *hdev)
> +/* Schedule iso */
> +static void hci_sched_iso(struct hci_dev *hdev, __u8 type)
>   {
>          struct hci_conn *conn;
>          struct sk_buff *skb;
> @@ -3753,14 +3756,12 @@ static void hci_sched_iso(struct hci_dev *hdev)
>
>          BT_DBG("%s", hdev->name);
>
> -       if (!hci_conn_num(hdev, CIS_LINK) &&
> -           !hci_conn_num(hdev, BIS_LINK))
> +       if (!hci_conn_num(hdev, type))
>                  return;
>
>          cnt = hdev->iso_pkts ? &hdev->iso_cnt :
>                  hdev->le_pkts ? &hdev->le_cnt : &hdev->acl_cnt;
> -       while (*cnt && (conn = hci_low_sent(hdev, CIS_LINK, BIS_LINK,
> -                                           &quote))) {
> +       while (*cnt && (conn = hci_low_sent(hdev, type, &quote))) {
>                  while (quote-- && (skb = skb_dequeue(&conn->data_q))) {
>                          BT_DBG("skb %p len %d", skb, skb->len);
>                          hci_send_conn_frame(hdev, conn, skb);
> @@ -3785,7 +3786,9 @@ static void hci_tx_work(struct work_struct *work)
>                  /* Schedule queues and send stuff to HCI driver */
>                  hci_sched_sco(hdev, SCO_LINK);
>                  hci_sched_sco(hdev, ESCO_LINK);
> -               hci_sched_iso(hdev);
> +               hci_sched_iso(hdev, CIS_LINK);
> +               hci_sched_iso(hdev, BIS_LINK);
> +               hci_sched_iso(hdev, PA_LINK);
>                  hci_sched_acl(hdev);
>                  hci_sched_le(hdev);
>          }
> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> index 2c14e9daa199..d1e77dfe9edf 100644
> --- a/net/bluetooth/hci_event.c
> +++ b/net/bluetooth/hci_event.c
> @@ -4433,6 +4433,7 @@ static void hci_num_comp_pkts_evt(struct hci_dev *hdev, void *data,
>
>                  case CIS_LINK:
>                  case BIS_LINK:
> +               case PA_LINK:
>                          if (hdev->iso_pkts) {
>                                  hdev->iso_cnt += count;
>                                  if (hdev->iso_cnt > hdev->iso_pkts)
> @@ -6378,7 +6379,7 @@ static void hci_le_pa_sync_established_evt(struct hci_dev *hdev, void *data,
>          conn->sync_handle = le16_to_cpu(ev->handle);
>          conn->sid = HCI_SID_INVALID;
>
> -       mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, BIS_LINK,
> +       mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, PA_LINK,
>                                        &flags);
>          if (!(mask & HCI_LM_ACCEPT)) {
>                  hci_le_pa_term_sync(hdev, ev->handle);
> @@ -6389,7 +6390,7 @@ static void hci_le_pa_sync_established_evt(struct hci_dev *hdev, void *data,
>                  goto unlock;
>
>          /* Add connection to indicate PA sync event */
> -       pa_sync = hci_conn_add_unset(hdev, BIS_LINK, BDADDR_ANY,
> +       pa_sync = hci_conn_add_unset(hdev, PA_LINK, BDADDR_ANY,
>                                       HCI_ROLE_SLAVE);
>
>          if (IS_ERR(pa_sync))
> @@ -6420,7 +6421,7 @@ static void hci_le_per_adv_report_evt(struct hci_dev *hdev, void *data,
>
>          hci_dev_lock(hdev);
>
> -       mask |= hci_proto_connect_ind(hdev, BDADDR_ANY, BIS_LINK, &flags);
> +       mask |= hci_proto_connect_ind(hdev, BDADDR_ANY, PA_LINK, &flags);
>          if (!(mask & HCI_LM_ACCEPT))
>                  goto unlock;
>
> diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
> index 4ea172a26ccc..d9bb543063fa 100644
> --- a/net/bluetooth/hci_sync.c
> +++ b/net/bluetooth/hci_sync.c
> @@ -2929,7 +2929,7 @@ static int hci_le_set_ext_scan_param_sync(struct hci_dev *hdev, u8 type,
>                  if (sent) {
>                          struct hci_conn *conn;
>
> -                       conn = hci_conn_hash_lookup_ba(hdev, BIS_LINK,
> +                       conn = hci_conn_hash_lookup_ba(hdev, PA_LINK,
>                                                         &sent->bdaddr);
>                          if (conn) {
>                                  struct bt_iso_qos *qos = &conn->iso_qos;
> @@ -5493,7 +5493,7 @@ static int hci_disconnect_sync(struct hci_dev *hdev, struct hci_conn *conn,
>   {
>          struct hci_cp_disconnect cp;
>
> -       if (conn->type == BIS_LINK) {
> +       if (conn->type == BIS_LINK || conn->type == PA_LINK) {
>                  /* This is a BIS connection, hci_conn_del will
>                   * do the necessary cleanup.
>                   */
> @@ -5562,7 +5562,7 @@ static int hci_connect_cancel_sync(struct hci_dev *hdev, struct hci_conn *conn,
>                  return HCI_ERROR_LOCAL_HOST_TERM;
>          }
>
> -       if (conn->type == BIS_LINK) {
> +       if (conn->type == BIS_LINK || conn->type == PA_LINK) {
>                  /* There is no way to cancel a BIS without terminating the BIG
>                   * which is done later on connection cleanup.
>                   */
> @@ -5627,7 +5627,7 @@ static int hci_reject_conn_sync(struct hci_dev *hdev, struct hci_conn *conn,
>          if (conn->type == CIS_LINK)
>                  return hci_le_reject_cis_sync(hdev, conn, reason);
>
> -       if (conn->type == BIS_LINK)
> +       if (conn->type == BIS_LINK || conn->type == PA_LINK)
>                  return -EINVAL;
>
>          if (conn->type == SCO_LINK || conn->type == ESCO_LINK)
> @@ -6995,7 +6995,7 @@ static void create_pa_complete(struct hci_dev *hdev, void *data, int err)
>                  goto unlock;
>
>          /* Add connection to indicate PA sync error */
> -       pa_sync = hci_conn_add_unset(hdev, BIS_LINK, BDADDR_ANY,
> +       pa_sync = hci_conn_add_unset(hdev, PA_LINK, BDADDR_ANY,
>                                       HCI_ROLE_SLAVE);
>
>          if (IS_ERR(pa_sync))
> diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c
> index fc22782cbeeb..dff99de98042 100644
> --- a/net/bluetooth/iso.c
> +++ b/net/bluetooth/iso.c
> @@ -2226,7 +2226,8 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)
>
>   static void iso_connect_cfm(struct hci_conn *hcon, __u8 status)
>   {
> -       if (hcon->type != CIS_LINK && hcon->type != BIS_LINK) {
> +       if (hcon->type != CIS_LINK && hcon->type != BIS_LINK &&
> +           hcon->type != PA_LINK) {
>                  if (hcon->type != LE_LINK)
>                          return;
>
> @@ -2267,7 +2268,8 @@ static void iso_connect_cfm(struct hci_conn *hcon, __u8 status)
>
>   static void iso_disconn_cfm(struct hci_conn *hcon, __u8 reason)
>   {
> -       if (hcon->type != CIS_LINK && hcon->type != BIS_LINK)
> +       if (hcon->type != CIS_LINK && hcon->type !=  BIS_LINK &&
> +           hcon->type != PA_LINK)
>                  return;
>
>          BT_DBG("hcon %p reason %d", hcon, reason);
> diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
> index 1485b455ade4..f90c53f7885b 100644
> --- a/net/bluetooth/mgmt.c
> +++ b/net/bluetooth/mgmt.c
> @@ -3239,6 +3239,7 @@ static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
>          switch (link_type) {
>          case CIS_LINK:
>          case BIS_LINK:
> +       case PA_LINK:
>          case LE_LINK:
>                  switch (addr_type) {
>                  case ADDR_LE_DEV_PUBLIC:
>
> ---
> base-commit: 98b3f8ecdd57baff41dceccf4cba5edff3b9c010
> change-id: 20250710-pa_link-94e292e2768e
>
> Best regards,
> --
> Yang Li <yang.li@amlogic.com>
>
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] Bluetooth: Add PA_LINK to distinguish BIG sync and PA sync connections
  2025-07-10 10:52 [PATCH] Bluetooth: Add PA_LINK to distinguish BIG sync and PA sync connections Yang Li via B4 Relay
  2025-07-10 11:34 ` bluez.test.bot
  2025-07-22  5:18 ` [PATCH] " Yang Li
@ 2025-07-22 14:50 ` patchwork-bot+bluetooth
  2 siblings, 0 replies; 4+ messages in thread
From: patchwork-bot+bluetooth @ 2025-07-22 14:50 UTC (permalink / raw)
  To: Yang Li
  Cc: marcel, johan.hedberg, luiz.dentz, davem, edumazet, kuba, pabeni,
	horms, linux-bluetooth, netdev, linux-kernel

Hello:

This patch was applied to bluetooth/bluetooth-next.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:

On Thu, 10 Jul 2025 18:52:47 +0800 you wrote:
> From: Yang Li <yang.li@amlogic.com>
> 
> Currently, BIS_LINK is used for both BIG sync and PA sync connections,
> which makes it impossible to distinguish them when searching for a PA
> sync connection.
> 
> Adding PA_LINK will make the distinction clearer and simplify future
> extensions for PA-related features.
> 
> [...]

Here is the summary with links:
  - Bluetooth: Add PA_LINK to distinguish BIG sync and PA sync connections
    https://git.kernel.org/bluetooth/bluetooth-next/c/1ffee96604de

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2025-07-22 14:49 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-10 10:52 [PATCH] Bluetooth: Add PA_LINK to distinguish BIG sync and PA sync connections Yang Li via B4 Relay
2025-07-10 11:34 ` bluez.test.bot
2025-07-22  5:18 ` [PATCH] " Yang Li
2025-07-22 14:50 ` patchwork-bot+bluetooth

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox