git: 3eda34934097 - main - libusb: implement libusb_fill_bulk_stream_transfer

From: ShengYi Hung <aokblast_at_FreeBSD.org>
Date: Mon, 21 Jul 2025 06:17:16 UTC
The branch main has been updated by aokblast:

URL: https://cgit.FreeBSD.org/src/commit/?id=3eda34934097f5cbf1e4a91d3b7acb58904be85e

commit 3eda34934097f5cbf1e4a91d3b7acb58904be85e
Author:     ShengYi Hung <aokblast@FreeBSD.org>
AuthorDate: 2025-07-09 11:27:26 +0000
Commit:     ShengYi Hung <aokblast@FreeBSD.org>
CommitDate: 2025-07-21 06:16:41 +0000

    libusb: implement libusb_fill_bulk_stream_transfer
    
    Bulk streams are essentially bulk transfers with a stream ID. All
    requirements from both libusb20 and the kernel are already handled; we
    just need to set the stream ID.
    
    Approved by:    markj (mentor), lwhsu(mentor)
    Differential Revision: https://reviews.freebsd.org/D51226
---
 lib/libusb/libusb.h      |  1 +
 lib/libusb/libusb10.c    |  1 +
 lib/libusb/libusb10_io.c | 13 +++++++++++++
 3 files changed, 15 insertions(+)

diff --git a/lib/libusb/libusb.h b/lib/libusb/libusb.h
index 57478c1787ee..1803ff637738 100644
--- a/lib/libusb/libusb.h
+++ b/lib/libusb/libusb.h
@@ -122,6 +122,7 @@ enum libusb_transfer_type {
 	LIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1,
 	LIBUSB_TRANSFER_TYPE_BULK = 2,
 	LIBUSB_TRANSFER_TYPE_INTERRUPT = 3,
+	LIBUSB_TRANSFER_TYPE_BULK_STREAM = 4,
 };
 
 enum libusb_standard_request {
diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c
index 6bfc01eb8c4e..5c116b39ea17 100644
--- a/lib/libusb/libusb10.c
+++ b/lib/libusb/libusb10.c
@@ -1530,6 +1530,7 @@ found:
 		libusb20_tr_set_callback(pxfer0, libusb10_isoc_proxy);
 		break;
 	case LIBUSB_TRANSFER_TYPE_BULK:
+	case LIBUSB_TRANSFER_TYPE_BULK_STREAM:
 	case LIBUSB_TRANSFER_TYPE_INTERRUPT:
 		libusb20_tr_set_callback(pxfer0, libusb10_bulk_intr_proxy);
 		break;
diff --git a/lib/libusb/libusb10_io.c b/lib/libusb/libusb10_io.c
index ea365162df5a..c99586ff650d 100644
--- a/lib/libusb/libusb10_io.c
+++ b/lib/libusb/libusb10_io.c
@@ -780,6 +780,19 @@ libusb_fill_interrupt_transfer(struct libusb_transfer *transfer,
 	transfer->callback = callback;
 }
 
+void
+libusb_fill_bulk_stream_transfer(struct libusb_transfer *transfer,
+    libusb_device_handle *dev_handle, unsigned char endpoint,
+    uint32_t stream_id, unsigned char *buffer, int length,
+    libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout)
+{
+	libusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer,
+	    length, callback, user_data, timeout);
+	transfer->type = LIBUSB_TRANSFER_TYPE_BULK_STREAM;
+
+	libusb_transfer_set_stream_id(transfer, stream_id);
+}
+
 void
 libusb_fill_iso_transfer(struct libusb_transfer *transfer, 
     libusb_device_handle *devh, uint8_t endpoint, uint8_t *buf,