Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Aug 2012 18:10:53 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r239239 - head/lib/libusb
Message-ID:  <201208131810.q7DIArL3074556@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Mon Aug 13 18:10:52 2012
New Revision: 239239
URL: http://svn.freebsd.org/changeset/base/239239

Log:
  Add support for streams to LibUSB v2.0.
  
  MFC after:	2 weeks

Modified:
  head/lib/libusb/libusb20.3
  head/lib/libusb/libusb20.c
  head/lib/libusb/libusb20.h
  head/lib/libusb/libusb20_int.h
  head/lib/libusb/libusb20_ugen20.c

Modified: head/lib/libusb/libusb20.3
==============================================================================
--- head/lib/libusb/libusb20.3	Mon Aug 13 18:09:19 2012	(r239238)
+++ head/lib/libusb/libusb20.3	Mon Aug 13 18:10:52 2012	(r239239)
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd October 14, 2010
+.Dd August 13, 2012
 .Dt LIBUSB20 3
 .Os
 .Sh NAME
@@ -48,6 +48,7 @@ USB access library (libusb -lusb)
 .Fn libusb20_tr_close "struct libusb20_transfer *xfer"
 .Ft int
 .Fn libusb20_tr_open "struct libusb20_transfer *xfer" "uint32_t max_buf_size" "uint32_t max_frame_count" "uint8_t ep_no"
+.Fn libusb20_tr_open_stream "struct libusb20_transfer *xfer" "uint32_t max_buf_size" "uint32_t max_frame_count" "uint8_t ep_no" "uint16_t stream_id"
 .Ft struct libusb20_transfer*
 .Fn libusb20_tr_get_pointer "struct libusb20_device *pdev"  "uint16_t tr_index"
 .Ft uint16_t
@@ -284,6 +285,16 @@ Non-zero return values indicate a LIBUSB
 .
 .Pp
 .
+.Fn libusb20_tr_open_stream
+is identical to
+.Fn libusb20_tr_open
+except that a stream ID can be specified for BULK endpoints having
+such a feature.
+.Fn libusb20_tr_open
+can be used to open stream ID zero.
+.
+.Pp
+.
 .Fn libusb20_tr_get_pointer
 will return a pointer to the allocated USB transfer according to the
 .Fa pdev

Modified: head/lib/libusb/libusb20.c
==============================================================================
--- head/lib/libusb/libusb20.c	Mon Aug 13 18:09:19 2012	(r239238)
+++ head/lib/libusb/libusb20.c	Mon Aug 13 18:10:52 2012	(r239239)
@@ -155,6 +155,13 @@ int
 libusb20_tr_open(struct libusb20_transfer *xfer, uint32_t MaxBufSize,
     uint32_t MaxFrameCount, uint8_t ep_no)
 {
+	return (libusb20_tr_open_stream(xfer, MaxBufSize, MaxFrameCount, ep_no, 0));
+}
+
+int
+libusb20_tr_open_stream(struct libusb20_transfer *xfer, uint32_t MaxBufSize,
+    uint32_t MaxFrameCount, uint8_t ep_no, uint16_t stream_id)
+{
 	uint32_t size;
 	uint8_t pre_scale;
 	int error;
@@ -188,7 +195,7 @@ libusb20_tr_open(struct libusb20_transfe
 	memset(xfer->ppBuffer, 0, size);
 
 	error = xfer->pdev->methods->tr_open(xfer, MaxBufSize,
-	    MaxFrameCount, ep_no, pre_scale);
+	    MaxFrameCount, ep_no, stream_id, pre_scale);
 
 	if (error) {
 		free(xfer->ppBuffer);

Modified: head/lib/libusb/libusb20.h
==============================================================================
--- head/lib/libusb/libusb20.h	Mon Aug 13 18:09:19 2012	(r239238)
+++ head/lib/libusb/libusb20.h	Mon Aug 13 18:10:52 2012	(r239239)
@@ -202,6 +202,7 @@ struct libusb20_quirk {
 /* USB transfer operations */
 int	libusb20_tr_close(struct libusb20_transfer *xfer);
 int	libusb20_tr_open(struct libusb20_transfer *xfer, uint32_t max_buf_size, uint32_t max_frame_count, uint8_t ep_no);
+int	libusb20_tr_open_stream(struct libusb20_transfer *xfer, uint32_t max_buf_size, uint32_t max_frame_count, uint8_t ep_no, uint16_t stream_id);
 struct libusb20_transfer *libusb20_tr_get_pointer(struct libusb20_device *pdev, uint16_t tr_index);
 uint16_t libusb20_tr_get_time_complete(struct libusb20_transfer *xfer);
 uint32_t libusb20_tr_get_actual_frames(struct libusb20_transfer *xfer);

Modified: head/lib/libusb/libusb20_int.h
==============================================================================
--- head/lib/libusb/libusb20_int.h	Mon Aug 13 18:09:19 2012	(r239238)
+++ head/lib/libusb/libusb20_int.h	Mon Aug 13 18:10:52 2012	(r239239)
@@ -110,7 +110,7 @@ typedef int (libusb20_set_config_index_t
 typedef int (libusb20_check_connected_t)(struct libusb20_device *pdev);
 
 /* USB transfer specific */
-typedef int (libusb20_tr_open_t)(struct libusb20_transfer *xfer, uint32_t MaxBufSize, uint32_t MaxFrameCount, uint8_t ep_no, uint8_t pre_scale);
+typedef int (libusb20_tr_open_t)(struct libusb20_transfer *xfer, uint32_t MaxBufSize, uint32_t MaxFrameCount, uint8_t ep_no, uint16_t stream_id, uint8_t pre_scale);
 typedef int (libusb20_tr_close_t)(struct libusb20_transfer *xfer);
 typedef int (libusb20_tr_clear_stall_sync_t)(struct libusb20_transfer *xfer);
 typedef void (libusb20_tr_submit_t)(struct libusb20_transfer *xfer);

Modified: head/lib/libusb/libusb20_ugen20.c
==============================================================================
--- head/lib/libusb/libusb20_ugen20.c	Mon Aug 13 18:09:19 2012	(r239238)
+++ head/lib/libusb/libusb20_ugen20.c	Mon Aug 13 18:10:52 2012	(r239239)
@@ -741,9 +741,13 @@ ugen20_process(struct libusb20_device *p
 
 static int
 ugen20_tr_open(struct libusb20_transfer *xfer, uint32_t MaxBufSize,
-    uint32_t MaxFrameCount, uint8_t ep_no, uint8_t pre_scale)
+    uint32_t MaxFrameCount, uint8_t ep_no, uint16_t stream_id,
+    uint8_t pre_scale)
 {
-	struct usb_fs_open temp;
+	union {
+		struct usb_fs_open fs_open;
+		struct usb_fs_open_stream fs_open_stream;
+	} temp;
 	struct usb_fs_endpoint *fsep;
 
 	if (pre_scale)
@@ -754,20 +758,26 @@ ugen20_tr_open(struct libusb20_transfer 
 	fsep = xfer->pdev->privBeData;
 	fsep += xfer->trIndex;
 
-	temp.max_bufsize = MaxBufSize;
-	temp.max_frames = MaxFrameCount;
-	temp.ep_index = xfer->trIndex;
-	temp.ep_no = ep_no;
+	temp.fs_open.max_bufsize = MaxBufSize;
+	temp.fs_open.max_frames = MaxFrameCount;
+	temp.fs_open.ep_index = xfer->trIndex;
+	temp.fs_open.ep_no = ep_no;
 
-	if (ioctl(xfer->pdev->file, USB_FS_OPEN, &temp)) {
-		return (LIBUSB20_ERROR_INVALID_PARAM);
+	if (stream_id != 0) {
+		temp.fs_open_stream.stream_id = stream_id;
+
+		if (ioctl(xfer->pdev->file, USB_FS_OPEN_STREAM, &temp.fs_open_stream))
+			return (LIBUSB20_ERROR_INVALID_PARAM);
+	} else {
+		if (ioctl(xfer->pdev->file, USB_FS_OPEN, &temp.fs_open))
+			return (LIBUSB20_ERROR_INVALID_PARAM);
 	}
 	/* maximums might have changed - update */
-	xfer->maxFrames = temp.max_frames;
+	xfer->maxFrames = temp.fs_open.max_frames;
 
 	/* "max_bufsize" should be multiple of "max_packet_length" */
-	xfer->maxTotalLength = temp.max_bufsize;
-	xfer->maxPacketLen = temp.max_packet_length;
+	xfer->maxTotalLength = temp.fs_open.max_bufsize;
+	xfer->maxPacketLen = temp.fs_open.max_packet_length;
 
 	/* setup buffer and length lists using zero copy */
 	fsep->ppBuffer = libusb20_pass_ptr(xfer->ppBuffer);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208131810.q7DIArL3074556>