Hi,
Thanks for your comments.
On 2015-01-22 15:56, Peter Stuge wrote:
This needs error checking. The open can fail.
Fixed - patch attached
+#endif
n = libusb_get_port_numbers(dev, port_numbers, sizeof(port_numbers));
+#ifdef __FreeBSD__
+ libusb_close(devh);
+#endif
Maybe make the above unconditional. The device will need to be open
later anyway. Yes, unneccessary to open it twice, but...
On the contrary I'd rather keep that change specific to FreeBSD - the
libusb implemtations seem to differ in semantics - with the conditional
define the damage is constrained to FreeBSD only.
Do you know why FreeBSD decided to have different semantics?
No, I've asked hps@ (and freebsd-usb ml) - and indicated the problem
with incompatible semantics between libusb implementations - but so far
no answers...
Revised patch attached
/Uffe
>From 76b5d1377574e7b8df7078f00a2d4a7b0f9dcd8f Mon Sep 17 00:00:00 2001
From: Uffe Jakobsen <[email protected]>
Date: Thu, 22 Jan 2015 01:11:22 +0100
Subject: [PATCH] Fix FreeBSD issue with libusb_get_port_numbers()
Currently (as of date 20150122) an ioctl problem within the
FreeBSD kernel is preventing libusb_get_port_numbers() from working.
Hence calls to libusb_get_port_numbers() will always return 0.
This makes it impossible to establish a physical path the the usb device.
This problem has existed "forever" -
meaning that libusb_get_port_numbers() have never worked.
A fix is committed to FreeBSD "current" head -
and will later be merged (MFC'ed) to maintenance branches.
See: https://svnweb.freebsd.org/base?view=revision&revision=277417
Additionally FreeBSD requires that devices prior to calling
libusb_get_port_numbers() have been opened with libusb_open().
The patch is "forwards-compatible".
Currently it acts specificly to libusb_get_port_numbers()
currently returning 0 on FreeBSD.
In these situations it constructs an artificial path to the device.
When FreeBSD kernels appears with proper working ioctl
supporting libusb_get_port_numbers() the code will construct
proper physical paths for newer kernels - while still generating
articicial physical paths for older defective kernels.
---
src/usb.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/src/usb.c b/src/usb.c
index 8bdb8d6..15a8e4c 100644
--- a/src/usb.c
+++ b/src/usb.c
@@ -276,8 +276,25 @@ SR_PRIV int usb_get_port_path(libusb_device *dev, char *path, int path_len)
uint8_t port_numbers[8];
int i, n, len;
+// FreeBSD requires that devices prior to calling libusb_get_port_numbers()
+// have been opened with libusb_open().
+#ifdef __FreeBSD__
+ struct libusb_device_handle* devh;
+ if (libusb_open(dev, &devh) != 0)
+ return SR_ERR;
+#endif
n = libusb_get_port_numbers(dev, port_numbers, sizeof(port_numbers));
+#ifdef __FreeBSD__
+ libusb_close(devh);
+#endif
+// Workaround FreeBSD libusb_get_port_numbers() returning 0
+#ifdef __FreeBSD__
+ if (n == 0) {
+ port_numbers[0] = libusb_get_device_address(dev);
+ n = 1;
+ }
+#endif
if (n < 1)
return SR_ERR;
--
2.2.2
------------------------------------------------------------------------------
New Year. New Location. New Benefits. New Data Center in Ashburn, VA.
GigeNET is offering a free month of service with a new server in Ashburn.
Choose from 2 high performing configs, both with 100TB of bandwidth.
Higher redundancy.Lower latency.Increased capacity.Completely compliant.
http://p.sf.net/sfu/gigenet
_______________________________________________
sigrok-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sigrok-devel