Date: Fri, 15 Jun 2007 17:25:39 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 121704 for review Message-ID: <200706151725.l5FHPdDK062548@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=121704 Change 121704 by hselasky@hselasky_mini_itx on 2007/06/15 17:25:03 Enhance the usability of the usbd_find_descriptor() function. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/if_cdce.c#19 edit .. //depot/projects/usb/src/sys/dev/usb/umodem.c#21 edit .. //depot/projects/usb/src/sys/dev/usb/usb_subr.c#38 edit .. //depot/projects/usb/src/sys/dev/usb/usb_subr.h#40 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/if_cdce.c#19 (text+ko) ==== @@ -253,7 +253,7 @@ } ud = usbd_find_descriptor - (uaa->device, uaa->iface_index, + (uaa->device, NULL, uaa->iface_index, UDESC_CS_INTERFACE, UDESCSUB_CDC_UNION); if ((ud == NULL) || (ud->bLength < sizeof(*ud))) { @@ -328,7 +328,7 @@ &cdce_ifmedia_sts_cb); ue = usbd_find_descriptor - (uaa->device, uaa->iface_index, + (uaa->device, NULL, uaa->iface_index, UDESC_CS_INTERFACE, UDESCSUB_CDC_ENF); if ((ue == NULL) || (ue->bLength < sizeof(*ue)) || ==== //depot/projects/usb/src/sys/dev/usb/umodem.c#21 (text+ko) ==== @@ -903,7 +903,7 @@ umodem_get_desc(struct usb_attach_arg *uaa, u_int8_t type, u_int8_t subtype) { return - usbd_find_descriptor(uaa->device, uaa->iface_index, type, subtype); + usbd_find_descriptor(uaa->device, NULL, uaa->iface_index, type, subtype); } static usbd_status ==== //depot/projects/usb/src/sys/dev/usb/usb_subr.c#38 (text+ko) ==== @@ -364,13 +364,22 @@ return (NULL); } +/*------------------------------------------------------------------------* + * usbd_find_descriptor + * + * This function will lookup the first descriptor that matches + * the criteria given by the arguments "type" and "subtype". Descriptors + * will only be searched within the interface having the index "iface_index". + * It is possible to specify the last descriptor returned by this function + * as the "id" argument. That way one can search for multiple descriptors + * matching the same criteria. + *------------------------------------------------------------------------*/ void * -usbd_find_descriptor(struct usbd_device *udev, uint16_t iface_index, +usbd_find_descriptor(struct usbd_device *udev, void *id, uint16_t iface_index, int16_t type, int16_t subtype) { usb_descriptor_t *desc; usb_config_descriptor_t *cd; - usb_interface_descriptor_t *id; struct usbd_interface *iface; cd = usbd_get_config_descriptor(udev); @@ -378,14 +387,16 @@ return NULL; } - iface = usbd_get_iface(udev, iface_index); - if (iface == NULL) { + if (id == NULL) { + iface = usbd_get_iface(udev, iface_index); + if (iface == NULL) { return NULL; - } + } - id = usbd_get_interface_descriptor(iface); - if (id == NULL) { + id = usbd_get_interface_descriptor(iface); + if (id == NULL) { return NULL; + } } desc = (void *)id; @@ -396,7 +407,8 @@ break; } - if ((desc->bDescriptorType == type) && + if (((type == USBD_TYPE_ANY) || + (type == desc->bDescriptorType)) && ((subtype == USBD_SUBTYPE_ANY) || (subtype == desc->bDescriptorSubtype))) { ==== //depot/projects/usb/src/sys/dev/usb/usb_subr.h#40 (text+ko) ==== @@ -541,6 +541,7 @@ /* prototypes from usb_subr.c */ +#define USBD_TYPE_ANY (-1) #define USBD_SUBTYPE_ANY (-1) #ifdef __FreeBSD__ @@ -559,7 +560,7 @@ struct usb_hid_descriptor *usbd_get_hdesc(usb_config_descriptor_t *cd, usb_interface_descriptor_t *id); usb_interface_descriptor_t *usbd_find_idesc(usb_config_descriptor_t *cd, uint16_t iface_index, uint16_t alt_index); usb_endpoint_descriptor_t *usbd_find_edesc(usb_config_descriptor_t *cd, uint16_t iface_index, uint16_t alt_index, uint16_t endptidx); -void * usbd_find_descriptor(struct usbd_device *udev, uint16_t iface_index, int16_t type, int16_t subtype); +void * usbd_find_descriptor(struct usbd_device *udev, void *id, uint16_t iface_index, int16_t type, int16_t subtype); int usbd_get_no_alts(usb_config_descriptor_t *cd, uint8_t ifaceno); usbd_status usbd_search_and_set_config(struct usbd_device *udev, int32_t no, int32_t msg); usbd_status usbd_set_config_index(struct usbd_device *udev, int32_t index, int32_t msg); @@ -819,10 +820,20 @@ /* prototypes from "usb_compat_linux.c" */ void usb_linux_free_usb_device(struct usb_device *dev); +/* USB virtual endpoint */ +struct usbd_vep { + struct usb_device_put_urb urb; + struct usbd_xfer *xfer[1]; + uint8_t dev_addr; + uint8_t isread; +}; + /* USB clone support */ struct usbd_clone { struct mtx mtx; struct usb_cdev cdev; + struct usb_device_poll_urb status; + struct usbd_vep vep[USB_DEVICE_VEP_MAX]; struct usbd_bus *bus; struct usbd_clone *next;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200706151725.l5FHPdDK062548>