linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1 1/2] Bluetooth: hci_uart: Refactor h4_recv_buf code into h4_recv_skb
@ 2025-11-05 17:04 Luiz Augusto von Dentz
  2025-11-05 17:04 ` [PATCH v1 2/2] Bluetooth: btusb: Add support for Bulk Serialization Mode Luiz Augusto von Dentz
  2025-11-05 17:36 ` [v1,1/2] Bluetooth: hci_uart: Refactor h4_recv_buf code into h4_recv_skb bluez.test.bot
  0 siblings, 2 replies; 5+ messages in thread
From: Luiz Augusto von Dentz @ 2025-11-05 17:04 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This refactors h4_recv_buf into h4_recv_skb so it can be used by
btusb to implement Bulk Serialization Mode.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
 drivers/bluetooth/hci_h4.c   | 45 +++++++++++++++++++++++++-----------
 drivers/bluetooth/hci_uart.h |  4 ++++
 2 files changed, 35 insertions(+), 14 deletions(-)

diff --git a/drivers/bluetooth/hci_h4.c b/drivers/bluetooth/hci_h4.c
index ec017df8572c..366a66b79e78 100644
--- a/drivers/bluetooth/hci_h4.c
+++ b/drivers/bluetooth/hci_h4.c
@@ -112,8 +112,9 @@ static int h4_recv(struct hci_uart *hu, const void *data, int count)
 	if (!test_bit(HCI_UART_REGISTERED, &hu->flags))
 		return -EUNATCH;
 
-	h4->rx_skb = h4_recv_buf(hu, h4->rx_skb, data, count,
-				 h4_recv_pkts, ARRAY_SIZE(h4_recv_pkts));
+	h4->rx_skb = h4_recv_skb(hu->hdev, &hu->alignment, &hu->padding,
+				 h4->rx_skb, data, count, h4_recv_pkts,
+				 ARRAY_SIZE(h4_recv_pkts));
 	if (IS_ERR(h4->rx_skb)) {
 		int err = PTR_ERR(h4->rx_skb);
 		bt_dev_err(hu->hdev, "Frame reassembly failed (%d)", err);
@@ -151,12 +152,12 @@ int __exit h4_deinit(void)
 	return hci_uart_unregister_proto(&h4p);
 }
 
-struct sk_buff *h4_recv_buf(struct hci_uart *hu, struct sk_buff *skb,
-			    const unsigned char *buffer, int count,
-			    const struct h4_recv_pkt *pkts, int pkts_count)
+struct sk_buff *h4_recv_skb(struct hci_dev *hdev, u8 *alignment, u8 *padding,
+			    struct sk_buff *skb, const unsigned char *buffer,
+			    int count, const struct h4_recv_pkt *pkts,
+			    int pkts_count)
 {
-	u8 alignment = hu->alignment ? hu->alignment : 1;
-	struct hci_dev *hdev = hu->hdev;
+	u8 align = alignment && *alignment ? *alignment : 1;
 
 	/* Check for error from previous call */
 	if (IS_ERR(skb))
@@ -166,10 +167,13 @@ struct sk_buff *h4_recv_buf(struct hci_uart *hu, struct sk_buff *skb,
 		int i, len;
 
 		/* remove padding bytes from buffer */
-		for (; hu->padding && count > 0; hu->padding--) {
-			count--;
-			buffer++;
+		if (padding) {
+			for (; (*padding) && count > 0; (*padding)--) {
+				count--;
+				buffer++;
+			}
 		}
+
 		if (!count)
 			break;
 
@@ -252,16 +256,20 @@ struct sk_buff *h4_recv_buf(struct hci_uart *hu, struct sk_buff *skb,
 			}
 
 			if (!dlen) {
-				hu->padding = (skb->len + 1) % alignment;
-				hu->padding = (alignment - hu->padding) % alignment;
+				if (padding) {
+					*padding = (skb->len + 1) % align;
+					*padding = (align - *padding) % align;
+				}
 
 				/* No more data, complete frame */
 				(&pkts[i])->recv(hdev, skb);
 				skb = NULL;
 			}
 		} else {
-			hu->padding = (skb->len + 1) % alignment;
-			hu->padding = (alignment - hu->padding) % alignment;
+			if (padding) {
+				*padding = (skb->len + 1) % align;
+				*padding = (align - *padding) % align;
+			}
 
 			/* Complete frame */
 			(&pkts[i])->recv(hdev, skb);
@@ -271,4 +279,13 @@ struct sk_buff *h4_recv_buf(struct hci_uart *hu, struct sk_buff *skb,
 
 	return skb;
 }
+EXPORT_SYMBOL_GPL(h4_recv_skb);
+
+struct sk_buff *h4_recv_buf(struct hci_uart *hu, struct sk_buff *skb,
+			    const unsigned char *buffer, int count,
+			    const struct h4_recv_pkt *pkts, int pkts_count)
+{
+	return h4_recv_skb(hu->hdev, &hu->alignment, &hu->padding, skb, buffer,
+			   count, pkts, pkts_count);
+}
 EXPORT_SYMBOL_GPL(h4_recv_buf);
diff --git a/drivers/bluetooth/hci_uart.h b/drivers/bluetooth/hci_uart.h
index 48ac7ca9334e..501b70889567 100644
--- a/drivers/bluetooth/hci_uart.h
+++ b/drivers/bluetooth/hci_uart.h
@@ -165,6 +165,10 @@ int h4_deinit(void);
 struct sk_buff *h4_recv_buf(struct hci_uart *hu, struct sk_buff *skb,
 			    const unsigned char *buffer, int count,
 			    const struct h4_recv_pkt *pkts, int pkts_count);
+struct sk_buff *h4_recv_skb(struct hci_dev *hdev, u8 *alignment, u8 *padding,
+			    struct sk_buff *skb, const unsigned char *buffer,
+			    int count, const struct h4_recv_pkt *pkts,
+			    int pkts_count);
 #endif
 
 #ifdef CONFIG_BT_HCIUART_BCSP
-- 
2.51.0


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

* [PATCH v1 2/2] Bluetooth: btusb: Add support for Bulk Serialization Mode
  2025-11-05 17:04 [PATCH v1 1/2] Bluetooth: hci_uart: Refactor h4_recv_buf code into h4_recv_skb Luiz Augusto von Dentz
@ 2025-11-05 17:04 ` Luiz Augusto von Dentz
  2025-11-06  3:24   ` kernel test robot
  2025-11-07  1:04   ` kernel test robot
  2025-11-05 17:36 ` [v1,1/2] Bluetooth: hci_uart: Refactor h4_recv_buf code into h4_recv_skb bluez.test.bot
  1 sibling, 2 replies; 5+ messages in thread
From: Luiz Augusto von Dentz @ 2025-11-05 17:04 UTC (permalink / raw)
  To: linux-bluetooth

From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds support for Bulk Serialization Mode introduced in 6.2:

https://www.bluetooth.com/bluetooth-core-6-2-feature-overview/#5-bluetooth-hci-usb-le-isochronous-support
https://www.bluetooth.com/wp-content/uploads/Files/Specification/HTML/Core-62/out/en/host-controller-interface/usb-transport-layer.html#UUID-c1a65395-29e9-87d3-2981-8bed625d0459

It works by detecting if alternate setting 1 is supported for the
interface and then switches to use it as it serializes all the frames
in a single Bulk endpoint using H4 headers and it considerable more
robust then legacy one while allowing the transport of ISO packets:

 'In addition to enabling Bluetooth® LE Audio, the new mode resolves a
 persistent race condition in the legacy USB transport layer. In Legacy
 Mode, different endpoint types are serviced in a specific order within
 a USB frame, which can result in out-of-order delivery of data and
 events. For example, a Host might receive a data packet before the
 event signaling its arrival. This behavior can disrupt critical
 processes such as connection setup, disconnection, and data encryption,
 adversely affecting the user experience.'

Signed-off-by: Johann Fischer <johann.fischer@nordicsemi.no>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
 drivers/bluetooth/btusb.c | 142 +++++++++++++++++++++++++++-----------
 1 file changed, 102 insertions(+), 40 deletions(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index dcbff764122f..e565f598b923 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -27,8 +27,9 @@
 #include "btbcm.h"
 #include "btrtl.h"
 #include "btmtk.h"
+#include "hci_uart.h"
 
-#define VERSION "0.8"
+#define VERSION "1.0"
 
 static bool disable_scofix;
 static bool force_scofix;
@@ -896,6 +897,9 @@ struct qca_dump_info {
 #define BTUSB_ALT6_CONTINUOUS_TX	16
 #define BTUSB_HW_SSR_ACTIVE	17
 
+#define BTUSB_PROTO_LEGACY	0x00
+#define BTUSB_PROTO_H4		0x01
+
 struct btusb_data {
 	struct hci_dev       *hdev;
 	struct usb_device    *udev;
@@ -929,6 +933,7 @@ struct btusb_data {
 	struct sk_buff *evt_skb;
 	struct sk_buff *acl_skb;
 	struct sk_buff *sco_skb;
+	struct sk_buff *rx_skb;
 
 	struct usb_endpoint_descriptor *intr_ep;
 	struct usb_endpoint_descriptor *bulk_tx_ep;
@@ -942,6 +947,7 @@ struct btusb_data {
 
 	__u8 cmdreq_type;
 	__u8 cmdreq;
+	__u8 proto;
 
 	unsigned int sco_num;
 	unsigned int air_mode;
@@ -1265,12 +1271,35 @@ static int btusb_recv_acl(struct btusb_data *data, struct sk_buff *skb)
 	return 0;
 }
 
+static const struct h4_recv_pkt btusb_recv_pkts[] = {
+	{ H4_RECV_ACL,          .recv = hci_recv_frame },
+	{ H4_RECV_SCO,          .recv = hci_recv_frame },
+	{ H4_RECV_EVENT,        .recv = hci_recv_frame },
+	{ H4_RECV_ISO,          .recv = hci_recv_frame },
+};
+
+static int btusb_recv_h4(struct btusb_data *data, void *buffer, int count)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&data->rxlock, flags);
+	data->rx_skb = h4_recv_skb(data->hdev, NULL, NULL, data->rx_skb, buffer,
+				   count, btusb_recv_pkts,
+				   ARRAY_SIZE(btusb_recv_pkts));
+	spin_unlock_irqrestore(&data->rxlock, flags);
+
+	return 0;
+}
+
 static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count)
 {
 	struct sk_buff *skb;
 	unsigned long flags;
 	int err = 0;
 
+	if (data->proto == BTUSB_PROTO_H4)
+		return btusb_recv_h4(data, buffer, count);
+
 	spin_lock_irqsave(&data->rxlock, flags);
 	skb = data->acl_skb;
 
@@ -1950,12 +1979,14 @@ static int btusb_open(struct hci_dev *hdev)
 
 	data->intf->needs_remote_wakeup = 1;
 
-	if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags))
-		goto done;
+	if (data->proto == BTUSB_PROTO_LEGACY) {
+		if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags))
+			goto done;
 
-	err = btusb_submit_intr_urb(hdev, GFP_KERNEL);
-	if (err < 0)
-		goto failed;
+		err = btusb_submit_intr_urb(hdev, GFP_KERNEL);
+		if (err < 0)
+			goto failed;
+	}
 
 	err = btusb_submit_bulk_urb(hdev, GFP_KERNEL);
 	if (err < 0) {
@@ -2045,6 +2076,34 @@ static int btusb_flush(struct hci_dev *hdev)
 	return 0;
 }
 
+static struct urb *alloc_bulk_urb(struct hci_dev *hdev, struct sk_buff *skb)
+{
+	struct btusb_data *data = hci_get_drvdata(hdev);
+	struct urb *urb;
+	unsigned int pipe;
+
+	if (!data->bulk_tx_ep)
+		return ERR_PTR(-ENODEV);
+
+	urb = usb_alloc_urb(0, GFP_KERNEL);
+	if (!urb)
+		return ERR_PTR(-ENOMEM);
+
+	pipe = usb_sndbulkpipe(data->udev, data->bulk_tx_ep->bEndpointAddress);
+
+	if (data->proto == BTUSB_PROTO_H4) {
+		/* Prepend skb with frame type */
+		memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
+	}
+
+	usb_fill_bulk_urb(urb, data->udev, pipe,
+			  skb->data, skb->len, btusb_tx_complete, skb);
+
+	skb->dev = (void *)hdev;
+
+	return urb;
+}
+
 static struct urb *alloc_ctrl_urb(struct hci_dev *hdev, struct sk_buff *skb)
 {
 	struct btusb_data *data = hci_get_drvdata(hdev);
@@ -2052,6 +2111,9 @@ static struct urb *alloc_ctrl_urb(struct hci_dev *hdev, struct sk_buff *skb)
 	struct urb *urb;
 	unsigned int pipe;
 
+	if (data->proto == BTUSB_PROTO_H4)
+		return alloc_bulk_urb(hdev, skb);
+
 	urb = usb_alloc_urb(0, GFP_KERNEL);
 	if (!urb)
 		return ERR_PTR(-ENOMEM);
@@ -2078,35 +2140,15 @@ static struct urb *alloc_ctrl_urb(struct hci_dev *hdev, struct sk_buff *skb)
 	return urb;
 }
 
-static struct urb *alloc_bulk_urb(struct hci_dev *hdev, struct sk_buff *skb)
-{
-	struct btusb_data *data = hci_get_drvdata(hdev);
-	struct urb *urb;
-	unsigned int pipe;
-
-	if (!data->bulk_tx_ep)
-		return ERR_PTR(-ENODEV);
-
-	urb = usb_alloc_urb(0, GFP_KERNEL);
-	if (!urb)
-		return ERR_PTR(-ENOMEM);
-
-	pipe = usb_sndbulkpipe(data->udev, data->bulk_tx_ep->bEndpointAddress);
-
-	usb_fill_bulk_urb(urb, data->udev, pipe,
-			  skb->data, skb->len, btusb_tx_complete, skb);
-
-	skb->dev = (void *)hdev;
-
-	return urb;
-}
-
 static struct urb *alloc_isoc_urb(struct hci_dev *hdev, struct sk_buff *skb)
 {
 	struct btusb_data *data = hci_get_drvdata(hdev);
 	struct urb *urb;
 	unsigned int pipe;
 
+	if (data->proto == BTUSB_PROTO_H4)
+		return alloc_bulk_urb(hdev, skb);
+
 	if (!data->isoc_tx_ep)
 		return ERR_PTR(-ENODEV);
 
@@ -2320,10 +2362,9 @@ static int btusb_switch_alt_setting(struct hci_dev *hdev, int new_alts)
 	return 0;
 }
 
-static struct usb_host_interface *btusb_find_altsetting(struct btusb_data *data,
-							int alt)
+static struct usb_host_interface *
+btusb_find_altsetting(struct usb_interface *intf, int alt)
 {
-	struct usb_interface *intf = data->isoc;
 	int i;
 
 	BT_DBG("Looking for Alt no :%d", alt);
@@ -2376,9 +2417,9 @@ static void btusb_work(struct work_struct *work)
 			 * MTU >= 3 (packets) * 25 (size) - 3 (headers) = 72
 			 * see also Core spec 5, vol 4, B 2.1.1 & Table 2.1.
 			 */
-			if (btusb_find_altsetting(data, 6))
+			if (btusb_find_altsetting(data->isoc, 6))
 				new_alts = 6;
-			else if (btusb_find_altsetting(data, 3) &&
+			else if (btusb_find_altsetting(data->isoc, 3) &&
 				 hdev->sco_mtu >= 72 &&
 				 test_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags))
 				new_alts = 3;
@@ -3827,8 +3868,11 @@ static ssize_t force_poll_sync_write(struct file *file,
 	if (err)
 		return err;
 
-	/* Only allow changes while the adapter is down */
-	if (test_bit(HCI_UP, &data->hdev->flags))
+	/* Only allow changes while the adapter is down and it is using legacy
+	 * protocol.
+	 */
+	if (test_bit(HCI_UP, &data->hdev->flags) ||
+	    data->proto != BTUSB_PROTO_LEGACY)
 		return -EPERM;
 
 	if (data->poll_sync == enable)
@@ -3927,7 +3971,7 @@ static int btusb_hci_drv_supported_altsettings(struct hci_dev *hdev, void *data,
 		goto done;
 
 	for (i = 0; i <= 6; i++) {
-		if (btusb_find_altsetting(drvdata, i))
+		if (btusb_find_altsetting(drvdata->isoc, i))
 			rp->altsettings[rp->num++] = i;
 	}
 
@@ -4022,6 +4066,15 @@ static int btusb_probe(struct usb_interface *intf,
 	if (!data)
 		return -ENOMEM;
 
+	/* If alternate setting 1 is found, it means H4 mode is supported */
+	if (btusb_find_altsetting(intf, 1)) {
+		struct usb_device *udev = interface_to_usbdev(intf);
+
+		err = usb_set_interface(udev, ifnum_base, 1);
+		if (!err)
+			data->proto = BTUSB_PROTO_H4;
+	}
+
 	for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
 		ep_desc = &intf->cur_altsetting->endpoint[i].desc;
 
@@ -4041,8 +4094,16 @@ static int btusb_probe(struct usb_interface *intf,
 		}
 	}
 
-	if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep)
-		return -ENODEV;
+	/* Check if all endpoints could be enumerated, legacy mode requires
+	 * interrupt and bulk endpoint while H4 mode only requires bulk
+	 * endpoints.
+	 */
+	if ((data->proto == BTUSB_PROTO_LEGACY && !data->intr_ep) ||
+	    !data->bulk_tx_ep || !data->bulk_rx_ep) {
+		BT_ERR("failed to enumerate endpoints");
+		err = -ENODEV;
+		goto out_free_dev;
+	}
 
 	if (id->driver_info & BTUSB_AMP) {
 		data->cmdreq_type = USB_TYPE_CLASS | 0x01;
@@ -4355,7 +4416,8 @@ static int btusb_probe(struct usb_interface *intf,
 	if (enable_autosuspend)
 		usb_enable_autosuspend(data->udev);
 
-	data->poll_sync = enable_poll_sync;
+	if (data->proto == BTUSB_PROTO_LEGACY)
+		data->poll_sync = enable_poll_sync;
 
 	err = hci_register_dev(hdev);
 	if (err < 0)
-- 
2.51.0


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

* RE: [v1,1/2] Bluetooth: hci_uart: Refactor h4_recv_buf code into h4_recv_skb
  2025-11-05 17:04 [PATCH v1 1/2] Bluetooth: hci_uart: Refactor h4_recv_buf code into h4_recv_skb Luiz Augusto von Dentz
  2025-11-05 17:04 ` [PATCH v1 2/2] Bluetooth: btusb: Add support for Bulk Serialization Mode Luiz Augusto von Dentz
@ 2025-11-05 17:36 ` bluez.test.bot
  1 sibling, 0 replies; 5+ messages in thread
From: bluez.test.bot @ 2025-11-05 17:36 UTC (permalink / raw)
  To: linux-bluetooth, luiz.dentz

[-- Attachment #1: Type: text/plain, Size: 2376 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=1020010

---Test result---

Test Summary:
CheckPatch                    PENDING   0.36 seconds
GitLint                       PENDING   0.29 seconds
SubjectPrefix                 PASS      0.16 seconds
BuildKernel                   PASS      25.10 seconds
CheckAllWarning               PASS      27.12 seconds
CheckSparse                   PASS      30.76 seconds
BuildKernel32                 PASS      24.24 seconds
TestRunnerSetup               PASS      491.67 seconds
TestRunner_l2cap-tester       PASS      23.48 seconds
TestRunner_iso-tester         PASS      64.17 seconds
TestRunner_bnep-tester        PASS      6.09 seconds
TestRunner_mgmt-tester        FAIL      118.16 seconds
TestRunner_rfcomm-tester      PASS      9.04 seconds
TestRunner_sco-tester         PASS      14.12 seconds
TestRunner_ioctl-tester       PASS      9.84 seconds
TestRunner_mesh-tester        FAIL      11.50 seconds
TestRunner_smp-tester         PASS      8.25 seconds
TestRunner_userchan-tester    PASS      6.41 seconds
IncrementalBuild              PENDING   0.53 seconds

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

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

##############################
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
Read Exp Feature - Success                           Failed       0.094 seconds
LL Privacy - Set Flags 1 (Add to RL)                 Failed       0.144 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.112 seconds
Mesh - Send cancel - 2                               Timed out    1.997 seconds
##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:



---
Regards,
Linux Bluetooth


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

* Re: [PATCH v1 2/2] Bluetooth: btusb: Add support for Bulk Serialization Mode
  2025-11-05 17:04 ` [PATCH v1 2/2] Bluetooth: btusb: Add support for Bulk Serialization Mode Luiz Augusto von Dentz
@ 2025-11-06  3:24   ` kernel test robot
  2025-11-07  1:04   ` kernel test robot
  1 sibling, 0 replies; 5+ messages in thread
From: kernel test robot @ 2025-11-06  3:24 UTC (permalink / raw)
  To: Luiz Augusto von Dentz, linux-bluetooth; +Cc: oe-kbuild-all

Hi Luiz,

kernel test robot noticed the following build errors:

[auto build test ERROR on bluetooth-next/master]
[also build test ERROR on bluetooth/master linus/master v6.18-rc4 next-20251105]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Luiz-Augusto-von-Dentz/Bluetooth-btusb-Add-support-for-Bulk-Serialization-Mode/20251106-024830
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git master
patch link:    https://lore.kernel.org/r/20251105170445.518320-2-luiz.dentz%40gmail.com
patch subject: [PATCH v1 2/2] Bluetooth: btusb: Add support for Bulk Serialization Mode
config: nios2-randconfig-002-20251106 (https://download.01.org/0day-ci/archive/20251106/202511061054.iucfnuVO-lkp@intel.com/config)
compiler: nios2-linux-gcc (GCC) 8.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251106/202511061054.iucfnuVO-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511061054.iucfnuVO-lkp@intel.com/

All error/warnings (new ones prefixed by >>):

   drivers/bluetooth/btusb.c: In function 'btusb_recv_h4':
>> drivers/bluetooth/btusb.c:1286:17: error: implicit declaration of function 'h4_recv_skb'; did you mean 'sk_eat_skb'? [-Werror=implicit-function-declaration]
     data->rx_skb = h4_recv_skb(data->hdev, NULL, NULL, data->rx_skb, buffer,
                    ^~~~~~~~~~~
                    sk_eat_skb
>> drivers/bluetooth/btusb.c:1286:15: warning: assignment to 'struct sk_buff *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
     data->rx_skb = h4_recv_skb(data->hdev, NULL, NULL, data->rx_skb, buffer,
                  ^
   cc1: some warnings being treated as errors


vim +1286 drivers/bluetooth/btusb.c

  1280	
  1281	static int btusb_recv_h4(struct btusb_data *data, void *buffer, int count)
  1282	{
  1283		unsigned long flags;
  1284	
  1285		spin_lock_irqsave(&data->rxlock, flags);
> 1286		data->rx_skb = h4_recv_skb(data->hdev, NULL, NULL, data->rx_skb, buffer,
  1287					   count, btusb_recv_pkts,
  1288					   ARRAY_SIZE(btusb_recv_pkts));
  1289		spin_unlock_irqrestore(&data->rxlock, flags);
  1290	
  1291		return 0;
  1292	}
  1293	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

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

* Re: [PATCH v1 2/2] Bluetooth: btusb: Add support for Bulk Serialization Mode
  2025-11-05 17:04 ` [PATCH v1 2/2] Bluetooth: btusb: Add support for Bulk Serialization Mode Luiz Augusto von Dentz
  2025-11-06  3:24   ` kernel test robot
@ 2025-11-07  1:04   ` kernel test robot
  1 sibling, 0 replies; 5+ messages in thread
From: kernel test robot @ 2025-11-07  1:04 UTC (permalink / raw)
  To: Luiz Augusto von Dentz, linux-bluetooth; +Cc: llvm, oe-kbuild-all

Hi Luiz,

kernel test robot noticed the following build warnings:

[auto build test WARNING on bluetooth-next/master]
[also build test WARNING on bluetooth/master linus/master v6.18-rc4 next-20251106]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Luiz-Augusto-von-Dentz/Bluetooth-btusb-Add-support-for-Bulk-Serialization-Mode/20251106-024830
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git master
patch link:    https://lore.kernel.org/r/20251105170445.518320-2-luiz.dentz%40gmail.com
patch subject: [PATCH v1 2/2] Bluetooth: btusb: Add support for Bulk Serialization Mode
config: loongarch-allmodconfig (https://download.01.org/0day-ci/archive/20251107/202511070808.Qvyqjzoc-lkp@intel.com/config)
compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251107/202511070808.Qvyqjzoc-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202511070808.Qvyqjzoc-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/bluetooth/btusb.c:4101:6: warning: variable 'hdev' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
    4101 |         if ((data->proto == BTUSB_PROTO_LEGACY && !data->intr_ep) ||
         |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    4102 |             !data->bulk_tx_ep || !data->bulk_rx_ep) {
         |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btusb.c:4436:15: note: uninitialized use occurs here
    4436 |         hci_free_dev(hdev);
         |                      ^~~~
   drivers/bluetooth/btusb.c:4101:2: note: remove the 'if' if its condition is always false
    4101 |         if ((data->proto == BTUSB_PROTO_LEGACY && !data->intr_ep) ||
         |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    4102 |             !data->bulk_tx_ep || !data->bulk_rx_ep) {
         |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    4103 |                 BT_ERR("failed to enumerate endpoints");
         |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    4104 |                 err = -ENODEV;
         |                 ~~~~~~~~~~~~~~
    4105 |                 goto out_free_dev;
         |                 ~~~~~~~~~~~~~~~~~~
    4106 |         }
         |         ~
>> drivers/bluetooth/btusb.c:4101:6: warning: variable 'hdev' is used uninitialized whenever '||' condition is true [-Wsometimes-uninitialized]
    4101 |         if ((data->proto == BTUSB_PROTO_LEGACY && !data->intr_ep) ||
         |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    4102 |             !data->bulk_tx_ep || !data->bulk_rx_ep) {
         |             ~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btusb.c:4436:15: note: uninitialized use occurs here
    4436 |         hci_free_dev(hdev);
         |                      ^~~~
   drivers/bluetooth/btusb.c:4101:6: note: remove the '||' if its condition is always false
    4101 |         if ((data->proto == BTUSB_PROTO_LEGACY && !data->intr_ep) ||
         |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    4102 |             !data->bulk_tx_ep || !data->bulk_rx_ep) {
         |             ~~~~~~~~~~~~~~~~~~~~
>> drivers/bluetooth/btusb.c:4101:6: warning: variable 'hdev' is used uninitialized whenever '||' condition is true [-Wsometimes-uninitialized]
    4101 |         if ((data->proto == BTUSB_PROTO_LEGACY && !data->intr_ep) ||
         |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btusb.c:4436:15: note: uninitialized use occurs here
    4436 |         hci_free_dev(hdev);
         |                      ^~~~
   drivers/bluetooth/btusb.c:4101:6: note: remove the '||' if its condition is always false
    4101 |         if ((data->proto == BTUSB_PROTO_LEGACY && !data->intr_ep) ||
         |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/bluetooth/btusb.c:4030:22: note: initialize the variable 'hdev' to silence this warning
    4030 |         struct hci_dev *hdev;
         |                             ^
         |                              = NULL
   3 warnings generated.


vim +4101 drivers/bluetooth/btusb.c

  4023	
  4024	static int btusb_probe(struct usb_interface *intf,
  4025			       const struct usb_device_id *id)
  4026	{
  4027		struct usb_endpoint_descriptor *ep_desc;
  4028		struct gpio_desc *reset_gpio;
  4029		struct btusb_data *data;
  4030		struct hci_dev *hdev;
  4031		unsigned ifnum_base;
  4032		int i, err, priv_size;
  4033	
  4034		BT_DBG("intf %p id %p", intf, id);
  4035	
  4036		if ((id->driver_info & BTUSB_IFNUM_2) &&
  4037		    (intf->cur_altsetting->desc.bInterfaceNumber != 0) &&
  4038		    (intf->cur_altsetting->desc.bInterfaceNumber != 2))
  4039			return -ENODEV;
  4040	
  4041		ifnum_base = intf->cur_altsetting->desc.bInterfaceNumber;
  4042	
  4043		if (!id->driver_info) {
  4044			const struct usb_device_id *match;
  4045	
  4046			match = usb_match_id(intf, quirks_table);
  4047			if (match)
  4048				id = match;
  4049		}
  4050	
  4051		if (id->driver_info == BTUSB_IGNORE)
  4052			return -ENODEV;
  4053	
  4054		if (id->driver_info & BTUSB_ATH3012) {
  4055			struct usb_device *udev = interface_to_usbdev(intf);
  4056	
  4057			/* Old firmware would otherwise let ath3k driver load
  4058			 * patch and sysconfig files
  4059			 */
  4060			if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001 &&
  4061			    !btusb_qca_need_patch(udev))
  4062				return -ENODEV;
  4063		}
  4064	
  4065		data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL);
  4066		if (!data)
  4067			return -ENOMEM;
  4068	
  4069		/* If alternate setting 1 is found, it means H4 mode is supported */
  4070		if (btusb_find_altsetting(intf, 1)) {
  4071			struct usb_device *udev = interface_to_usbdev(intf);
  4072	
  4073			err = usb_set_interface(udev, ifnum_base, 1);
  4074			if (!err)
  4075				data->proto = BTUSB_PROTO_H4;
  4076		}
  4077	
  4078		for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
  4079			ep_desc = &intf->cur_altsetting->endpoint[i].desc;
  4080	
  4081			if (!data->intr_ep && usb_endpoint_is_int_in(ep_desc)) {
  4082				data->intr_ep = ep_desc;
  4083				continue;
  4084			}
  4085	
  4086			if (!data->bulk_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) {
  4087				data->bulk_tx_ep = ep_desc;
  4088				continue;
  4089			}
  4090	
  4091			if (!data->bulk_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) {
  4092				data->bulk_rx_ep = ep_desc;
  4093				continue;
  4094			}
  4095		}
  4096	
  4097		/* Check if all endpoints could be enumerated, legacy mode requires
  4098		 * interrupt and bulk endpoint while H4 mode only requires bulk
  4099		 * endpoints.
  4100		 */
> 4101		if ((data->proto == BTUSB_PROTO_LEGACY && !data->intr_ep) ||
  4102		    !data->bulk_tx_ep || !data->bulk_rx_ep) {
  4103			BT_ERR("failed to enumerate endpoints");
  4104			err = -ENODEV;
  4105			goto out_free_dev;
  4106		}
  4107	
  4108		if (id->driver_info & BTUSB_AMP) {
  4109			data->cmdreq_type = USB_TYPE_CLASS | 0x01;
  4110			data->cmdreq = 0x2b;
  4111		} else {
  4112			data->cmdreq_type = USB_TYPE_CLASS;
  4113			data->cmdreq = 0x00;
  4114		}
  4115	
  4116		data->udev = interface_to_usbdev(intf);
  4117		data->intf = intf;
  4118	
  4119		INIT_WORK(&data->work, btusb_work);
  4120		INIT_WORK(&data->waker, btusb_waker);
  4121		INIT_DELAYED_WORK(&data->rx_work, btusb_rx_work);
  4122	
  4123		skb_queue_head_init(&data->acl_q);
  4124	
  4125		init_usb_anchor(&data->deferred);
  4126		init_usb_anchor(&data->tx_anchor);
  4127		spin_lock_init(&data->txlock);
  4128	
  4129		init_usb_anchor(&data->intr_anchor);
  4130		init_usb_anchor(&data->bulk_anchor);
  4131		init_usb_anchor(&data->isoc_anchor);
  4132		init_usb_anchor(&data->diag_anchor);
  4133		init_usb_anchor(&data->ctrl_anchor);
  4134		spin_lock_init(&data->rxlock);
  4135	
  4136		priv_size = 0;
  4137	
  4138		data->recv_event = hci_recv_frame;
  4139		data->recv_bulk = btusb_recv_bulk;
  4140	
  4141		if (id->driver_info & BTUSB_INTEL_COMBINED) {
  4142			/* Allocate extra space for Intel device */
  4143			priv_size += sizeof(struct btintel_data);
  4144	
  4145			/* Override the rx handlers */
  4146			data->recv_event = btintel_recv_event;
  4147			data->recv_bulk = btusb_recv_bulk_intel;
  4148		} else if (id->driver_info & BTUSB_REALTEK) {
  4149			/* Allocate extra space for Realtek device */
  4150			priv_size += sizeof(struct btrealtek_data);
  4151	
  4152			data->recv_event = btusb_recv_event_realtek;
  4153		} else if (id->driver_info & BTUSB_MEDIATEK) {
  4154			/* Allocate extra space for Mediatek device */
  4155			priv_size += sizeof(struct btmtk_data);
  4156		}
  4157	
  4158		data->recv_acl = hci_recv_frame;
  4159	
  4160		hdev = hci_alloc_dev_priv(priv_size);
  4161		if (!hdev)
  4162			return -ENOMEM;
  4163	
  4164		hdev->bus = HCI_USB;
  4165		hci_set_drvdata(hdev, data);
  4166	
  4167		data->hdev = hdev;
  4168	
  4169		SET_HCIDEV_DEV(hdev, &intf->dev);
  4170	
  4171		reset_gpio = gpiod_get_optional(&data->udev->dev, "reset",
  4172						GPIOD_OUT_LOW);
  4173		if (IS_ERR(reset_gpio)) {
  4174			err = PTR_ERR(reset_gpio);
  4175			goto out_free_dev;
  4176		} else if (reset_gpio) {
  4177			data->reset_gpio = reset_gpio;
  4178		}
  4179	
  4180		hdev->open    = btusb_open;
  4181		hdev->close   = btusb_close;
  4182		hdev->flush   = btusb_flush;
  4183		hdev->send    = btusb_send_frame;
  4184		hdev->notify  = btusb_notify;
  4185		hdev->wakeup  = btusb_wakeup;
  4186		hdev->hci_drv = &btusb_hci_drv;
  4187	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

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

end of thread, other threads:[~2025-11-07  1:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-05 17:04 [PATCH v1 1/2] Bluetooth: hci_uart: Refactor h4_recv_buf code into h4_recv_skb Luiz Augusto von Dentz
2025-11-05 17:04 ` [PATCH v1 2/2] Bluetooth: btusb: Add support for Bulk Serialization Mode Luiz Augusto von Dentz
2025-11-06  3:24   ` kernel test robot
2025-11-07  1:04   ` kernel test robot
2025-11-05 17:36 ` [v1,1/2] Bluetooth: hci_uart: Refactor h4_recv_buf code into h4_recv_skb bluez.test.bot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).