summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/usb/ugen.c49
-rw-r--r--sys/dev/usb/usb_subr.c36
-rw-r--r--sys/dev/usb/usbdi.h3
3 files changed, 43 insertions, 45 deletions
diff --git a/sys/dev/usb/ugen.c b/sys/dev/usb/ugen.c
index 83f579d1d67..513805594b3 100644
--- a/sys/dev/usb/ugen.c
+++ b/sys/dev/usb/ugen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ugen.c,v 1.69 2013/03/28 03:58:03 tedu Exp $ */
+/* $OpenBSD: ugen.c,v 1.70 2013/04/01 19:49:53 mglocker Exp $ */
/* $NetBSD: ugen.c,v 1.63 2002/11/26 18:49:48 christos Exp $ */
/* $FreeBSD: src/sys/dev/usb/ugen.c,v 1.26 1999/11/17 22:33:41 n_hibma Exp $ */
@@ -114,8 +114,6 @@ int ugen_do_write(struct ugen_softc *, int, struct uio *, int);
int ugen_do_ioctl(struct ugen_softc *, int, u_long,
caddr_t, int, struct proc *);
int ugen_set_config(struct ugen_softc *sc, int configno);
-usb_config_descriptor_t *ugen_get_cdesc(struct ugen_softc *sc,
- int index, int *lenp);
usbd_status ugen_set_interface(struct ugen_softc *, int, int);
int ugen_get_alt_index(struct ugen_softc *sc, int ifaceidx);
@@ -945,41 +943,6 @@ out:
return (err);
}
-/* Retrieve a complete descriptor for a certain device and index. */
-usb_config_descriptor_t *
-ugen_get_cdesc(struct ugen_softc *sc, int index, int *lenp)
-{
- usb_config_descriptor_t *cdesc, *tdesc, cdescr;
- int len;
- usbd_status err;
-
- if (index == USB_CURRENT_CONFIG_INDEX) {
- tdesc = usbd_get_config_descriptor(sc->sc_udev);
- len = UGETW(tdesc->wTotalLength);
- if (lenp)
- *lenp = len;
- cdesc = malloc(len, M_TEMP, M_WAITOK);
- memcpy(cdesc, tdesc, len);
- DPRINTFN(5,("ugen_get_cdesc: current, len=%d\n", len));
- } else {
- err = usbd_get_config_desc(sc->sc_udev, index, &cdescr);
- if (err)
- return (0);
- len = UGETW(cdescr.wTotalLength);
- DPRINTFN(5,("ugen_get_cdesc: index=%d, len=%d\n", index, len));
- if (lenp)
- *lenp = len;
- cdesc = malloc(len, M_TEMP, M_WAITOK);
- err = usbd_get_config_desc_full(sc->sc_udev, index, cdesc,
- len);
- if (err) {
- free(cdesc, M_TEMP);
- return (0);
- }
- }
- return (cdesc);
-}
-
int
ugen_get_alt_index(struct ugen_softc *sc, int ifaceidx)
{
@@ -1097,7 +1060,7 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd,
break;
case USB_GET_NO_ALT:
ai = (struct usb_alt_interface *)addr;
- cdesc = ugen_get_cdesc(sc, ai->uai_config_index, 0);
+ cdesc = usbd_get_cdesc(sc->sc_udev, ai->uai_config_index, 0);
if (cdesc == NULL)
return (EINVAL);
idesc = usbd_find_idesc(cdesc, ai->uai_interface_index, 0);
@@ -1115,7 +1078,7 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd,
break;
case USB_GET_CONFIG_DESC:
cd = (struct usb_config_desc *)addr;
- cdesc = ugen_get_cdesc(sc, cd->ucd_config_index, 0);
+ cdesc = usbd_get_cdesc(sc->sc_udev, cd->ucd_config_index, 0);
if (cdesc == NULL)
return (EINVAL);
cd->ucd_desc = *cdesc;
@@ -1123,7 +1086,7 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd,
break;
case USB_GET_INTERFACE_DESC:
id = (struct usb_interface_desc *)addr;
- cdesc = ugen_get_cdesc(sc, id->uid_config_index, 0);
+ cdesc = usbd_get_cdesc(sc->sc_udev, id->uid_config_index, 0);
if (cdesc == NULL)
return (EINVAL);
if (id->uid_config_index == USB_CURRENT_CONFIG_INDEX &&
@@ -1141,7 +1104,7 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd,
break;
case USB_GET_ENDPOINT_DESC:
ed = (struct usb_endpoint_desc *)addr;
- cdesc = ugen_get_cdesc(sc, ed->ued_config_index, 0);
+ cdesc = usbd_get_cdesc(sc->sc_udev, ed->ued_config_index, 0);
if (cdesc == NULL)
return (EINVAL);
if (ed->ued_config_index == USB_CURRENT_CONFIG_INDEX &&
@@ -1166,7 +1129,7 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd,
struct usb_full_desc *fd = (struct usb_full_desc *)addr;
int error;
- cdesc = ugen_get_cdesc(sc, fd->ufd_config_index, &len);
+ cdesc = usbd_get_cdesc(sc->sc_udev, fd->ufd_config_index, &len);
if (cdesc == NULL)
return (EINVAL);
if (len > fd->ufd_size)
diff --git a/sys/dev/usb/usb_subr.c b/sys/dev/usb/usb_subr.c
index 8c51584dd3a..976353cb574 100644
--- a/sys/dev/usb/usb_subr.c
+++ b/sys/dev/usb/usb_subr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: usb_subr.c,v 1.84 2013/03/28 03:58:03 tedu Exp $ */
+/* $OpenBSD: usb_subr.c,v 1.85 2013/04/01 19:49:53 mglocker Exp $ */
/* $NetBSD: usb_subr.c,v 1.103 2003/01/10 11:19:13 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $ */
@@ -1399,6 +1399,40 @@ usbd_fill_deviceinfo(usbd_device_handle dev, struct usb_device_info *di,
sizeof(di->udi_serial));
}
+/* Retrieve a complete descriptor for a certain device and index. */
+usb_config_descriptor_t *
+usbd_get_cdesc(usbd_device_handle dev, int index, int *lenp)
+{
+ usb_config_descriptor_t *cdesc, *tdesc, cdescr;
+ int len;
+ usbd_status err;
+
+ if (index == USB_CURRENT_CONFIG_INDEX) {
+ tdesc = usbd_get_config_descriptor(dev);
+ len = UGETW(tdesc->wTotalLength);
+ if (lenp)
+ *lenp = len;
+ cdesc = malloc(len, M_TEMP, M_WAITOK);
+ memcpy(cdesc, tdesc, len);
+ DPRINTFN(5,("usbd_get_cdesc: current, len=%d\n", len));
+ } else {
+ err = usbd_get_config_desc(dev, index, &cdescr);
+ if (err)
+ return (0);
+ len = UGETW(cdescr.wTotalLength);
+ DPRINTFN(5,("usbd_get_cdesc: index=%d, len=%d\n", index, len));
+ if (lenp)
+ *lenp = len;
+ cdesc = malloc(len, M_TEMP, M_WAITOK);
+ err = usbd_get_config_desc_full(dev, index, cdesc, len);
+ if (err) {
+ free(cdesc, M_TEMP);
+ return (0);
+ }
+ }
+ return (cdesc);
+}
+
void
usb_free_device(usbd_device_handle dev, struct usbd_port *up)
{
diff --git a/sys/dev/usb/usbdi.h b/sys/dev/usb/usbdi.h
index fddeb194c1a..0440d55370d 100644
--- a/sys/dev/usb/usbdi.h
+++ b/sys/dev/usb/usbdi.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: usbdi.h,v 1.42 2011/02/09 20:24:39 jakemsr Exp $ */
+/* $OpenBSD: usbdi.h,v 1.43 2013/04/01 19:49:53 mglocker Exp $ */
/* $NetBSD: usbdi.h,v 1.62 2002/07/11 21:14:35 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usbdi.h,v 1.18 1999/11/17 22:33:49 n_hibma Exp $ */
@@ -140,6 +140,7 @@ int usbd_get_no_alts(usb_config_descriptor_t *, int);
usbd_status usbd_get_interface(usbd_interface_handle iface, u_int8_t *aiface);
void usbd_fill_deviceinfo(usbd_device_handle, struct usb_device_info *, int);
void usbd_fill_di_task(void *);
+usb_config_descriptor_t *usbd_get_cdesc(usbd_device_handle, int, int *);
int usbd_get_interface_altindex(usbd_interface_handle iface);
usb_interface_descriptor_t *usbd_find_idesc(usb_config_descriptor_t *cd,