From owner-p4-projects@FreeBSD.ORG Sun Sep 23 16:25:44 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id DB0A016A421; Sun, 23 Sep 2007 16:25:43 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 929D816A41A for ; Sun, 23 Sep 2007 16:25:43 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 702F413C459 for ; Sun, 23 Sep 2007 16:25:43 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l8NGPhce097041 for ; Sun, 23 Sep 2007 16:25:43 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l8NGPhaR097038 for perforce@freebsd.org; Sun, 23 Sep 2007 16:25:43 GMT (envelope-from hselasky@FreeBSD.org) Date: Sun, 23 Sep 2007 16:25:43 GMT Message-Id: <200709231625.l8NGPhaR097038@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 126745 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 23 Sep 2007 16:25:44 -0000 http://perforce.freebsd.org/chv.cgi?CH=126745 Change 126745 by hselasky@hselasky_laptop001 on 2007/09/23 16:25:37 - moved and renamed two functions into "usb_hid.c" from "usb_subr.c" Affected files ... .. //depot/projects/usb/src/sys/dev/usb/usb_hid.c#4 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/usb_hid.c#4 (text+ko) ==== @@ -464,3 +464,79 @@ hid_end_parse(hd); return (err); } + +usb_hid_descriptor_t * +hid_get_descriptor_from_usb(usb_config_descriptor_t *cd, + usb_interface_descriptor_t *id) +{ + usb_descriptor_t *desc = (void *)id; + + if(desc == NULL) { + return NULL; + } + + while ((desc = usbd_desc_foreach(cd, desc))) + { + if ((desc->bDescriptorType == UDESC_HID) && + (desc->bLength >= USB_HID_DESCRIPTOR_SIZE(0))) + { + return (void *)desc; + } + + if (desc->bDescriptorType == UDESC_INTERFACE) + { + break; + } + } + return NULL; +} + +usbd_status +hid_read_report_desc_from_usb(struct usbd_device *udev, struct mtx *mtx, + void **descp, uint16_t *sizep, + usb_malloc_type mem, uint8_t iface_index) +{ + struct usbd_interface *iface = usbd_get_iface(udev, iface_index); + usb_hid_descriptor_t *hid; + usbd_status err; + + if((iface == NULL) || (iface->idesc == NULL)) + { + return USBD_INVAL; + } + + hid = hid_get_descriptor_from_usb + (usbd_get_config_descriptor(udev), iface->idesc); + + if(hid == NULL) + { + return USBD_IOERROR; + } + + *sizep = UGETW(hid->descrs[0].wDescriptorLength); + if (*sizep == 0) { + return USBD_IOERROR; + } + + if (mtx) mtx_unlock(mtx); + + *descp = malloc(*sizep, mem, M_ZERO|M_WAITOK); + + if (mtx) mtx_lock(mtx); + + if(*descp == NULL) + { + return USBD_NOMEM; + } + + err = usbreq_get_report_descriptor + (udev, mtx, *descp, *sizep, iface_index); + + if(err) + { + free(*descp, mem); + *descp = NULL; + return err; + } + return USBD_NORMAL_COMPLETION; +}