|
|
@@ -925,7 +925,7 @@ int usb_get_bos_descriptor(struct usb_device *dev)
|
|
|
struct usb_bos_descriptor *bos;
|
|
|
struct usb_dev_cap_header *cap;
|
|
|
struct usb_ssp_cap_descriptor *ssp_cap;
|
|
|
- unsigned char *buffer;
|
|
|
+ unsigned char *buffer, *buffer0;
|
|
|
int length, total_len, num, i, ssac;
|
|
|
__u8 cap_type;
|
|
|
int ret;
|
|
|
@@ -970,10 +970,12 @@ int usb_get_bos_descriptor(struct usb_device *dev)
|
|
|
ret = -ENOMSG;
|
|
|
goto err;
|
|
|
}
|
|
|
+
|
|
|
+ buffer0 = buffer;
|
|
|
total_len -= length;
|
|
|
+ buffer += length;
|
|
|
|
|
|
for (i = 0; i < num; i++) {
|
|
|
- buffer += length;
|
|
|
cap = (struct usb_dev_cap_header *)buffer;
|
|
|
|
|
|
if (total_len < sizeof(*cap) || total_len < cap->bLength) {
|
|
|
@@ -987,8 +989,6 @@ int usb_get_bos_descriptor(struct usb_device *dev)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- total_len -= length;
|
|
|
-
|
|
|
if (cap->bDescriptorType != USB_DT_DEVICE_CAPABILITY) {
|
|
|
dev_warn(ddev, "descriptor type invalid, skip\n");
|
|
|
continue;
|
|
|
@@ -1023,7 +1023,11 @@ int usb_get_bos_descriptor(struct usb_device *dev)
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+ total_len -= length;
|
|
|
+ buffer += length;
|
|
|
}
|
|
|
+ dev->bos->desc->wTotalLength = cpu_to_le16(buffer - buffer0);
|
|
|
|
|
|
return 0;
|
|
|
|