svn commit: r305284 - head/lib/libusb
Hans Petter Selasky
hselasky at FreeBSD.org
Fri Sep 2 08:44:16 UTC 2016
Author: hselasky
Date: Fri Sep 2 08:44:14 2016
New Revision: 305284
URL: https://svnweb.freebsd.org/changeset/base/305284
Log:
Fix array size issue when using the pre-scaling feature for
ISOCHRONOUS USB transfers. Make sure enough length and buffer pointers
are allocated when setting up the libusb transfer structure to support
the maximum number of frames the kernel can handle.
MFC after: 1 week
Modified:
head/lib/libusb/libusb20.c
Modified: head/lib/libusb/libusb20.c
==============================================================================
--- head/lib/libusb/libusb20.c Fri Sep 2 08:17:43 2016 (r305283)
+++ head/lib/libusb/libusb20.c Fri Sep 2 08:44:14 2016 (r305284)
@@ -176,6 +176,12 @@ libusb20_tr_open_stream(struct libusb20_
return (LIBUSB20_ERROR_BUSY);
if (MaxFrameCount & LIBUSB20_MAX_FRAME_PRE_SCALE) {
MaxFrameCount &= ~LIBUSB20_MAX_FRAME_PRE_SCALE;
+ /*
+ * The kernel can setup 8 times more frames when
+ * pre-scaling ISOCHRONOUS transfers. Make sure the
+ * length and pointer buffers are big enough:
+ */
+ MaxFrameCount *= 8;
pre_scale = 1;
} else {
pre_scale = 0;
@@ -200,8 +206,13 @@ libusb20_tr_open_stream(struct libusb20_
}
memset(xfer->ppBuffer, 0, size);
- error = xfer->pdev->methods->tr_open(xfer, MaxBufSize,
- MaxFrameCount, ep_no, stream_id, pre_scale);
+ if (pre_scale) {
+ error = xfer->pdev->methods->tr_open(xfer, MaxBufSize,
+ MaxFrameCount / 8, ep_no, stream_id, 1);
+ } else {
+ error = xfer->pdev->methods->tr_open(xfer, MaxBufSize,
+ MaxFrameCount, ep_no, stream_id, 0);
+ }
if (error) {
free(xfer->ppBuffer);
More information about the svn-src-head
mailing list