diff options
author | alfred <alfred@FreeBSD.org> | 2009-07-30 00:15:50 +0000 |
---|---|---|
committer | alfred <alfred@FreeBSD.org> | 2009-07-30 00:15:50 +0000 |
commit | ec456e3a3b32ea50f5c8e3b3a05352e989c10967 (patch) | |
tree | ad76cd69ab61646de0aee618acfa94818090e52d /sys/dev/usb/usb_parse.c | |
parent | fee3a289891db0743737072e9c451512f989ceae (diff) | |
download | FreeBSD-src-ec456e3a3b32ea50f5c8e3b3a05352e989c10967.zip FreeBSD-src-ec456e3a3b32ea50f5c8e3b3a05352e989c10967.tar.gz |
USB core:
- add support for defragging of written device data.
- improve handling of alternate settings in device side mode.
- correct return value from usbd_get_no_alts() function.
- reported by: HPS
- P4 ID: 166156, 166168
- report USB device release information to devd and pnpinfo.
- reported by: MIHIRA Sanpei Yoshiro
- P4 ID: 166221
Submitted by: hps
Approved by: re
Diffstat (limited to 'sys/dev/usb/usb_parse.c')
-rw-r--r-- | sys/dev/usb/usb_parse.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/sys/dev/usb/usb_parse.c b/sys/dev/usb/usb_parse.c index 884bd05..deb52ea 100644 --- a/sys/dev/usb/usb_parse.c +++ b/sys/dev/usb/usb_parse.c @@ -215,20 +215,29 @@ usbd_get_no_descriptors(struct usb_config_descriptor *cd, uint8_t type) * usbd_get_no_alts * * Return value: - * Number of alternate settings for the given interface descriptor pointer. + * Number of alternate settings for the given interface descriptor + * pointer. If the USB descriptor is corrupt, the returned value can + * be greater than the actual number of alternate settings. *------------------------------------------------------------------------*/ uint8_t usbd_get_no_alts(struct usb_config_descriptor *cd, struct usb_interface_descriptor *id) { struct usb_descriptor *desc; - uint8_t n = 0; + uint8_t n; uint8_t ifaceno; + /* Reset interface count */ + + n = 0; + + /* Get the interface number */ + ifaceno = id->bInterfaceNumber; - desc = (struct usb_descriptor *)id; + /* Iterate all the USB descriptors */ + desc = NULL; while ((desc = usb_desc_foreach(cd, desc))) { if ((desc->bDescriptorType == UDESC_INTERFACE) && (desc->bLength >= sizeof(*id))) { @@ -237,8 +246,7 @@ usbd_get_no_alts(struct usb_config_descriptor *cd, n++; if (n == 0xFF) break; /* crazy */ - } else - break; /* end */ + } } } return (n); |