From 6f703a2e85a3098b3546a0ce254349b72b440628 Mon Sep 17 00:00:00 2001 From: Marcus Comstedt Date: Wed, 22 Sep 2010 20:09:44 +0200 Subject: [PATCH] Fix USB endianness bugs on Linux. The fields device->idVendor and device->idProduct should not be converted from little endian to native byteorder, because the kernel has in fact done so already! On the other hand, the descriptors read using raw ioctl:s in register_device() do need to be converted. Change-Id: I5fe08b626b14ead56a592b68d026690e343c2656 --- adb/usb_linux.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/adb/usb_linux.c b/adb/usb_linux.c index bb8681351..2f7f8706a 100644 --- a/adb/usb_linux.c +++ b/adb/usb_linux.c @@ -191,9 +191,8 @@ static void find_usb_device(const char *base, continue; } - vid = __le16_to_cpu(device->idVendor); - pid = __le16_to_cpu(device->idProduct); - pid = devdesc[10] | (devdesc[11] << 8); + vid = device->idVendor; + pid = device->idProduct; DBGX("[ %s is V:%04x P:%04x ]\n", devname, vid, pid); // should have config descriptor next @@ -617,7 +616,7 @@ static void register_device(const char *dev_name, ctrl.bRequestType = USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE; ctrl.bRequest = USB_REQ_GET_DESCRIPTOR; ctrl.wValue = (USB_DT_STRING << 8) | serial_index; - ctrl.wIndex = languages[i]; + ctrl.wIndex = __le16_to_cpu(languages[i]); ctrl.wLength = sizeof(buffer); ctrl.data = buffer; @@ -627,7 +626,7 @@ static void register_device(const char *dev_name, // skip first word, and copy the rest to the serial string, changing shorts to bytes. result /= 2; for (i = 1; i < result; i++) - serial[i - 1] = buffer[i]; + serial[i - 1] = __le16_to_cpu(buffer[i]); serial[i - 1] = 0; break; }