summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/usb_parse.c
diff options
context:
space:
mode:
authoralfred <alfred@FreeBSD.org>2009-07-30 00:15:50 +0000
committeralfred <alfred@FreeBSD.org>2009-07-30 00:15:50 +0000
commitec456e3a3b32ea50f5c8e3b3a05352e989c10967 (patch)
treead76cd69ab61646de0aee618acfa94818090e52d /sys/dev/usb/usb_parse.c
parentfee3a289891db0743737072e9c451512f989ceae (diff)
downloadFreeBSD-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.c18
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);
OpenPOWER on IntegriCloud