summaryrefslogtreecommitdiff
path: root/sys/dev/usb
diff options
context:
space:
mode:
authorMartin Pieuchot <mpi@cvs.openbsd.org>2014-08-08 14:20:06 +0000
committerMartin Pieuchot <mpi@cvs.openbsd.org>2014-08-08 14:20:06 +0000
commit3c6d2496b55a0ec92eb4e479e74ea9a77cd2a420 (patch)
tree11084eab77a0a73c14137e2e9c5ebe39b369e6ae /sys/dev/usb
parent6c5c76cf789aeda60c2d61998e42e83b7d9e7a60 (diff)
Super Speed hub descriptor definition and routine, required for upcoming
external USB 3.0 hub support.
Diffstat (limited to 'sys/dev/usb')
-rw-r--r--sys/dev/usb/usb.h18
-rw-r--r--sys/dev/usb/usbdi_util.c17
-rw-r--r--sys/dev/usb/usbdi_util.h4
3 files changed, 34 insertions, 5 deletions
diff --git a/sys/dev/usb/usb.h b/sys/dev/usb/usb.h
index eb4bbe06a10..98c71b0284d 100644
--- a/sys/dev/usb/usb.h
+++ b/sys/dev/usb/usb.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: usb.h,v 1.46 2014/03/08 11:47:26 mpi Exp $ */
+/* $OpenBSD: usb.h,v 1.47 2014/08/08 14:20:05 mpi Exp $ */
/* $NetBSD: usb.h,v 1.69 2002/09/22 23:20:50 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usb.h,v 1.14 1999/11/17 22:33:46 n_hibma Exp $ */
@@ -328,9 +328,21 @@ typedef struct {
uByte DeviceRemovable[32]; /* max 255 ports */
#define UHD_NOT_REMOV(desc, i) \
(((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1)
- /* deprecated */ uByte PortPowerCtrlMask[1];
} __packed usb_hub_descriptor_t;
-#define USB_HUB_DESCRIPTOR_SIZE 9 /* includes deprecated PortPowerCtrlMask */
+#define USB_HUB_DESCRIPTOR_SIZE 8
+
+typedef struct {
+ uByte bDescLength;
+ uByte bDescriptorType;
+ uByte bNbrPorts;
+ uWord wHubCharacteristics;
+ uByte bPwrOn2PwrGood; /* delay in 2 ms units */
+ uByte bHubContrCurrent;
+ uByte bHubHdrDecLat;
+ uWord wHubDelay;
+ uByte DeviceRemovable[32]; /* max 255 ports */
+} __packed usb_hub_ss_descriptor_t;
+#define USB_HUB_SS_DESCRIPTOR_SIZE 11
typedef struct {
uByte bLength;
diff --git a/sys/dev/usb/usbdi_util.c b/sys/dev/usb/usbdi_util.c
index 50629ab82c3..ba5d8e5bad2 100644
--- a/sys/dev/usb/usbdi_util.c
+++ b/sys/dev/usb/usbdi_util.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: usbdi_util.c,v 1.37 2014/07/09 15:47:54 mpi Exp $ */
+/* $OpenBSD: usbdi_util.c,v 1.38 2014/08/08 14:20:05 mpi Exp $ */
/* $NetBSD: usbdi_util.c,v 1.40 2002/07/11 21:14:36 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usbdi_util.c,v 1.14 1999/11/17 22:33:50 n_hibma Exp $ */
@@ -114,6 +114,21 @@ usbd_get_hub_descriptor(struct usbd_device *dev, usb_hub_descriptor_t *hd,
}
usbd_status
+usbd_get_hub_ss_descriptor(struct usbd_device *dev, usb_hub_ss_descriptor_t *hd,
+ uint8_t nports)
+{
+ usb_device_request_t req;
+ uint16_t len = USB_HUB_SS_DESCRIPTOR_SIZE + (nports + 1) / 8;
+
+ req.bmRequestType = UT_READ_CLASS_DEVICE;
+ req.bRequest = UR_GET_DESCRIPTOR;
+ USETW2(req.wValue, UDESC_SS_HUB, 0);
+ USETW(req.wIndex, 0);
+ USETW(req.wLength, len);
+ return (usbd_do_request(dev, &req, hd));
+}
+
+usbd_status
usbd_get_port_status(struct usbd_device *dev, int port, usb_port_status_t *ps)
{
usb_device_request_t req;
diff --git a/sys/dev/usb/usbdi_util.h b/sys/dev/usb/usbdi_util.h
index b79622a6a90..85d8d884045 100644
--- a/sys/dev/usb/usbdi_util.h
+++ b/sys/dev/usb/usbdi_util.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: usbdi_util.h,v 1.26 2014/07/09 15:47:54 mpi Exp $ */
+/* $OpenBSD: usbdi_util.h,v 1.27 2014/08/08 14:20:05 mpi Exp $ */
/* $NetBSD: usbdi_util.h,v 1.28 2002/07/11 21:14:36 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usbdi_util.h,v 1.9 1999/11/17 22:33:50 n_hibma Exp $ */
@@ -44,6 +44,8 @@ usbd_status usbd_get_device_status(struct usbd_device *, usb_status_t *);
usbd_status usbd_get_hub_status(struct usbd_device *, usb_hub_status_t *);
usbd_status usbd_get_hub_descriptor(struct usbd_device *,
usb_hub_descriptor_t *, uint8_t);
+usbd_status usbd_get_hub_ss_descriptor(struct usbd_device *,
+ usb_hub_ss_descriptor_t *, uint8_t);
struct usb_hid_descriptor *usbd_get_hid_descriptor(struct usbd_device *,
usb_interface_descriptor_t *);
usbd_status usbd_get_report(struct usbd_device *, int, int, int, void *,