summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2011-02-17 15:06:40 +0100
committerPeter Stuge <peter@stuge.se>2011-09-15 15:16:20 +0200
commit44d6319f57e7e2c77347da228ed032e62716b438 (patch)
tree156ff8a1d655f4999086cbaea2f0f2d642899c09
parentc8c40bcbd22abca922ff31c4ed6a75fd7af78b59 (diff)
downloadlibusb-44d6319f57e7e2c77347da228ed032e62716b438.tar.gz
Linux: Provide libusb_get_device_speed() data from sysfs
References #45. Signed-off-by: Hans de Goede <hdegoede@redhat.com>
-rw-r--r--libusb/os/linux_usbfs.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/libusb/os/linux_usbfs.c b/libusb/os/linux_usbfs.c
index a1825ad..ca75779 100644
--- a/libusb/os/linux_usbfs.c
+++ b/libusb/os/linux_usbfs.c
@@ -784,7 +784,7 @@ static int initialize_device(struct libusb_device *dev, uint8_t busnum,
struct linux_device_priv *priv = __device_priv(dev);
unsigned char *dev_buf;
char path[PATH_MAX];
- int fd;
+ int fd, speed;
int active_config = 0;
int device_configured = 1;
ssize_t r;
@@ -797,6 +797,20 @@ static int initialize_device(struct libusb_device *dev, uint8_t busnum,
if (!priv->sysfs_dir)
return LIBUSB_ERROR_NO_MEM;
strcpy(priv->sysfs_dir, sysfs_dir);
+
+ /* Note speed can contain 1.5, in this case __read_sysfs_attr
+ will stop parsing at the '.' and return 1 */
+ speed = __read_sysfs_attr(DEVICE_CTX(dev), sysfs_dir, "speed");
+ if (speed >= 0) {
+ switch (speed) {
+ case 1: dev->speed = LIBUSB_SPEED_LOW; break;
+ case 12: dev->speed = LIBUSB_SPEED_FULL; break;
+ case 480: dev->speed = LIBUSB_SPEED_HIGH; break;
+ case 5000: dev->speed = LIBUSB_SPEED_SUPER; break;
+ default:
+ usbi_warn(DEVICE_CTX(dev), "Unknown device speed: %d Mbps", speed);
+ }
+ }
}
if (sysfs_has_descriptors)