PERFORCE change 144427 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Tue Jul 1 16:49:50 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=144427
Change 144427 by hselasky at hselasky_laptop001 on 2008/07/01 16:48:54
Mostly USB HUB descriptor cleanup. The substitution I made
for the HUB descriptor size was incorrect. Cleanup this and
some other USB descriptor related stuff.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb2/controller/at91dci.c#3 edit
.. //depot/projects/usb/src/sys/dev/usb2/controller/ehci2.c#4 edit
.. //depot/projects/usb/src/sys/dev/usb2/controller/ehci2.h#3 edit
.. //depot/projects/usb/src/sys/dev/usb2/controller/ohci2.c#3 edit
.. //depot/projects/usb/src/sys/dev/usb2/controller/ohci2.h#3 edit
.. //depot/projects/usb/src/sys/dev/usb2/controller/uhci2.c#4 edit
.. //depot/projects/usb/src/sys/dev/usb2/controller/uhci2.h#3 edit
.. //depot/projects/usb/src/sys/dev/usb2/controller/uss820dci.c#3 edit
.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_hub.c#6 edit
.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.c#4 edit
.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.h#3 edit
.. //depot/projects/usb/src/sys/dev/usb2/include/usb2_standard.h#4 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb2/controller/at91dci.c#3 (text+ko) ====
@@ -1830,8 +1830,8 @@
},
};
-static const struct usb2_hub_descriptor at91dci_hubd = {
- .bDescLength = sizeof(struct usb2_hub_descriptor),
+static const struct usb2_hub_descriptor_min at91dci_hubd = {
+ .bDescLength = sizeof(at91dci_hubd),
.bDescriptorType = UDESC_HUB,
.bNbrPorts = 1,
.wHubCharacteristics[0] =
==== //depot/projects/usb/src/sys/dev/usb2/controller/ehci2.c#4 (text+ko) ====
@@ -2975,35 +2975,33 @@
static const struct ehci_config_desc ehci_confd = {
.confd = {
- sizeof(struct usb2_config_descriptor),
- UDESC_CONFIG,
- {sizeof(ehci_confd), 0},
- 1,
- 1,
- 0,
- UC_SELF_POWERED,
- 0 /* max power */
+ .bLength = sizeof(struct usb2_config_descriptor),
+ .bDescriptorType = UDESC_CONFIG,
+ .wTotalLength[0] = sizeof(ehci_confd),
+ .bNumInterface = 1,
+ .bConfigurationValue = 1,
+ .iConfiguration = 0,
+ .bmAttributes = UC_SELF_POWERED,
+ .bMaxPower = 0 /* max power */
},
.ifcd = {
- sizeof(struct usb2_interface_descriptor),
- UDESC_INTERFACE,
- 0,
- 0,
- 1,
- UICLASS_HUB,
- UISUBCLASS_HUB,
- UIPROTO_HSHUBSTT,
+ .bLength = sizeof(struct usb2_interface_descriptor),
+ .bDescriptorType = UDESC_INTERFACE,
+ .bNumEndpoints = 1,
+ .bInterfaceClass = UICLASS_HUB,
+ .bInterfaceSubClass = UISUBCLASS_HUB,
+ .bInterfaceProtocol = UIPROTO_HSHUBSTT,
0
},
.endpd = {
- sizeof(struct usb2_endpoint_descriptor),
- UDESC_ENDPOINT,
- UE_DIR_IN | EHCI_INTR_ENDPT,
- UE_INTERRUPT,
- {8, 0}, /* max packet (63 ports) */
- 255
+ .bLength = sizeof(struct usb2_endpoint_descriptor),
+ .bDescriptorType = UDESC_ENDPOINT,
+ .bEndpointAddress = UE_DIR_IN | EHCI_INTR_ENDPT,
+ .bmAttributes = UE_INTERRUPT,
+ .wMaxPacketSize[0] = 8, /* max packet (63 ports) */
+ .bInterval = 255,
},
};
@@ -3142,7 +3140,7 @@
goto done;
}
std->len = sizeof(ehci_confd);
- sc->sc_hub_desc.confd = ehci_confd;
+ std->ptr = USB_ADD_BYTES(&ehci_confd, 0);
break;
case UDESC_STRING:
==== //depot/projects/usb/src/sys/dev/usb2/controller/ehci2.h#3 (text+ko) ====
@@ -438,7 +438,6 @@
struct usb2_device_descriptor devd;
struct usb2_device_qualifier odevd;
struct usb2_hub_descriptor hubd;
- struct ehci_config_desc confd;
uint8_t temp[128];
};
==== //depot/projects/usb/src/sys/dev/usb2/controller/ohci2.c#3 (text+ko) ====
@@ -2121,35 +2121,32 @@
struct ohci_config_desc ohci_confd =
{
.confd = {
- sizeof(struct usb2_config_descriptor),
- UDESC_CONFIG,
- {sizeof(ohci_confd), 0},
- 1,
- 1,
- 0,
- UC_SELF_POWERED,
- 0 /* max power */
+ .bLength = sizeof(struct usb2_config_descriptor),
+ .bDescriptorType = UDESC_CONFIG,
+ .wTotalLength[0] = sizeof(ohci_confd),
+ .bNumInterface = 1,
+ .bConfigurationValue = 1,
+ .iConfiguration = 0,
+ .bmAttributes = UC_SELF_POWERED,
+ .bMaxPower = 0, /* max power */
},
.ifcd = {
- sizeof(struct usb2_interface_descriptor),
- UDESC_INTERFACE,
- 0,
- 0,
- 1,
- UICLASS_HUB,
- UISUBCLASS_HUB,
- UIPROTO_FSHUB,
- 0
+ .bLength = sizeof(struct usb2_interface_descriptor),
+ .bDescriptorType = UDESC_INTERFACE,
+ .bNumEndpoints = 1,
+ .bInterfaceClass = UICLASS_HUB,
+ .bInterfaceSubClass = UISUBCLASS_HUB,
+ .bInterfaceProtocol = UIPROTO_FSHUB,
},
.endpd = {
- sizeof(struct usb2_endpoint_descriptor),
- UDESC_ENDPOINT,
- UE_DIR_IN | OHCI_INTR_ENDPT,
- UE_INTERRUPT,
- {32, 0}, /* max packet (255 ports) */
- 255
+ .bLength = sizeof(struct usb2_endpoint_descriptor),
+ .bDescriptorType = UDESC_ENDPOINT,
+ .bEndpointAddress = UE_DIR_IN | OHCI_INTR_ENDPT,
+ .bmAttributes = UE_INTERRUPT,
+ .wMaxPacketSize[0] = 32,/* max packet (255 ports) */
+ .bInterval = 255,
},
};
@@ -2259,7 +2256,7 @@
goto done;
}
std->len = sizeof(ohci_confd);
- sc->sc_hub_desc.confd = ohci_confd;
+ std->ptr = USB_ADD_BYTES(&ohci_confd, 0);
break;
case UDESC_STRING:
==== //depot/projects/usb/src/sys/dev/usb2/controller/ohci2.h#3 (text+ko) ====
@@ -311,7 +311,6 @@
struct usb2_port_status ps;
struct usb2_device_descriptor devd;
struct usb2_hub_descriptor hubd;
- struct ohci_config_desc confd;
uint8_t temp[128];
};
==== //depot/projects/usb/src/sys/dev/usb2/controller/uhci2.c#4 (text+ko) ====
@@ -2363,42 +2363,39 @@
static const struct uhci_config_desc uhci_confd = {
.confd = {
- sizeof(struct usb2_config_descriptor),
- UDESC_CONFIG,
- {sizeof(uhci_confd), 0},
- 1,
- 1,
- 0,
- UC_SELF_POWERED,
- 0 /* max power */
+ .bLength = sizeof(struct usb2_config_descriptor),
+ .bDescriptorType = UDESC_CONFIG,
+ .wTotalLength[0] = sizeof(uhci_confd),
+ .bNumInterface = 1,
+ .bConfigurationValue = 1,
+ .iConfiguration = 0,
+ .bmAttributes = UC_SELF_POWERED,
+ .bMaxPower = 0 /* max power */
},
.ifcd = {
- sizeof(struct usb2_interface_descriptor),
- UDESC_INTERFACE,
- 0,
- 0,
- 1,
- UICLASS_HUB,
- UISUBCLASS_HUB,
- UIPROTO_FSHUB,
- 0
+ .bLength = sizeof(struct usb2_interface_descriptor),
+ .bDescriptorType = UDESC_INTERFACE,
+ .bNumEndpoints = 1,
+ .bInterfaceClass = UICLASS_HUB,
+ .bInterfaceSubClass = UISUBCLASS_HUB,
+ .bInterfaceProtocol = UIPROTO_FSHUB,
},
.endpd = {
- sizeof(struct usb2_endpoint_descriptor),
- UDESC_ENDPOINT,
- UE_DIR_IN | UHCI_INTR_ENDPT,
- UE_INTERRUPT,
- {8, 0}, /* max packet (63 ports) */
- 255
+ .bLength = sizeof(struct usb2_endpoint_descriptor),
+ .bDescriptorType = UDESC_ENDPOINT,
+ .bEndpointAddress = UE_DIR_IN | UHCI_INTR_ENDPT,
+ .bmAttributes = UE_INTERRUPT,
+ .wMaxPacketSize[0] = 8, /* max packet (63 ports) */
+ .bInterval = 255,
},
};
static const
-struct usb2_hub_descriptor uhci_hubd_piix =
+struct usb2_hub_descriptor_min uhci_hubd_piix =
{
- sizeof(struct usb2_hub_descriptor),
+ sizeof(uhci_hubd_piix),
UDESC_HUB,
2,
{UHD_PWR_NO_SWITCH | UHD_OC_INDIVIDUAL, 0},
@@ -2618,7 +2615,7 @@
goto done;
}
std->len = sizeof(uhci_confd);
- sc->sc_hub_desc.confd = uhci_confd;
+ std->ptr = USB_ADD_BYTES(&uhci_confd, 0);
break;
case UDESC_STRING:
@@ -2763,7 +2760,7 @@
goto done;
}
std->len = sizeof(uhci_hubd_piix);
- sc->sc_hub_desc.hubd = uhci_hubd_piix;
+ std->ptr = USB_ADD_BYTES(&uhci_hubd_piix, 0);
break;
case C(UR_GET_STATUS, UT_READ_CLASS_DEVICE):
std->len = 16;
==== //depot/projects/usb/src/sys/dev/usb2/controller/uhci2.h#3 (text+ko) ====
@@ -241,8 +241,6 @@
struct usb2_status stat;
struct usb2_port_status ps;
struct usb2_device_descriptor devd;
- struct usb2_hub_descriptor hubd;
- struct uhci_config_desc confd;
uint8_t temp[128];
};
==== //depot/projects/usb/src/sys/dev/usb2/controller/uss820dci.c#3 (text+ko) ====
@@ -1861,8 +1861,8 @@
},
};
-static const struct usb2_hub_descriptor uss820dci_hubd = {
- .bDescLength = sizeof(struct usb2_hub_descriptor),
+static const struct usb2_hub_descriptor_min uss820dci_hubd = {
+ .bDescLength = sizeof(uss820dci_hubd),
.bDescriptorType = UDESC_HUB,
.bNbrPorts = 1,
.wHubCharacteristics[0] =
==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_hub.c#6 (text+ko) ====
@@ -596,7 +596,6 @@
struct usb2_device *udev = uaa->device;
struct usb2_device *parent_hub = udev->parent_hub;
struct usb2_hub *hub;
- struct usb2_device_request req;
struct usb2_hub_descriptor hubdesc;
uint16_t pwrdly;
uint8_t x;
@@ -632,29 +631,22 @@
}
if (!udev->flags.self_powered && parent_hub &&
(!parent_hub->flags.self_powered)) {
- DPRINTF(-1, "bus powered hub connected to "
- "bus powered hub. HUB ignored!\n");
+ DPRINTF(-1, "bus powered HUB connected to "
+ "bus powered HUB. HUB ignored!\n");
goto error;
}
- /* get hub descriptor */
+ /* get HUB descriptor */
- DPRINTF(1, "getting hub descriptor\n");
+ DPRINTF(1, "getting HUB descriptor\n");
- req.bmRequestType = UT_READ_CLASS_DEVICE;
- req.bRequest = UR_GET_DESCRIPTOR;
- USETW2(req.wValue, UDESC_HUB, 0);
- USETW(req.wIndex, 0);
- USETW(req.wLength, 9); /* assuming that there is one port */
-
- err = usb2_do_request(udev, &Giant, &req, &hubdesc);
+ /* assuming that there is one port */
+ err = usb2_req_get_hub_descriptor(udev, &Giant, &hubdesc, 1);
nports = hubdesc.bNbrPorts;
if (!err && (nports >= 8)) {
- uint16_t len = 8 + ((nports + 7) / 8);
-
- USETW(req.wLength, len);
- err = usb2_do_request(udev, &Giant, &req, &hubdesc);
+ /* get complete HUB descriptor */
+ err = usb2_req_get_hub_descriptor(udev, &Giant, &hubdesc, nports);
}
if (err) {
DPRINTF(-1, "getting hub descriptor failed,"
==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.c#4 (text+ko) ====
@@ -892,7 +892,7 @@
req.bRequest = UR_GET_STATUS;
USETW(req.wValue, 0);
USETW(req.wIndex, 0);
- USETW(req.wLength, sizeof(usb2_error_t));
+ USETW(req.wLength, sizeof(*st));
return (usb2_do_request(udev, mtx, &req, st));
}
@@ -905,15 +905,16 @@
*------------------------------------------------------------------------*/
usb2_error_t
usb2_req_get_hub_descriptor(struct usb2_device *udev, struct mtx *mtx,
- struct usb2_hub_descriptor *hd)
+ struct usb2_hub_descriptor *hd, uint8_t nports)
{
struct usb2_device_request req;
+ uint16_t len = (nports + 7 + (8 * 8)) / 8;
req.bmRequestType = UT_READ_CLASS_DEVICE;
req.bRequest = UR_GET_DESCRIPTOR;
- USETW(req.wValue, 0);
+ USETW2(req.wValue, UDESC_HUB, 0);
USETW(req.wIndex, 0);
- USETW(req.wLength, sizeof(*hd));
+ USETW(req.wLength, len);
return (usb2_do_request(udev, mtx, &req, hd));
}
==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.h#3 (text+ko) ====
@@ -36,7 +36,7 @@
usb2_error_t usb2_req_get_desc(struct usb2_device *udev, struct mtx *mtx, void *desc, uint16_t min_len, uint16_t max_len, uint16_t id, uint8_t type, uint8_t index, uint8_t retries);
usb2_error_t usb2_req_get_device_desc(struct usb2_device *udev, struct mtx *mtx, struct usb2_device_descriptor *d);
usb2_error_t usb2_req_get_device_status(struct usb2_device *udev, struct mtx *mtx, struct usb2_status *st);
-usb2_error_t usb2_req_get_hub_descriptor(struct usb2_device *udev, struct mtx *mtx, struct usb2_hub_descriptor *hd);
+usb2_error_t usb2_req_get_hub_descriptor(struct usb2_device *udev, struct mtx *mtx, struct usb2_hub_descriptor *hd, uint8_t nports);
usb2_error_t usb2_req_get_hub_status(struct usb2_device *udev, struct mtx *mtx, struct usb2_hub_status *st);
usb2_error_t usb2_req_get_port_status(struct usb2_device *udev, struct mtx *mtx, struct usb2_port_status *ps, uint8_t port);
usb2_error_t usb2_req_get_report(struct usb2_device *udev, struct mtx *mtx, void *data, uint16_t len, uint8_t iface_index, uint8_t type, uint8_t id);
==== //depot/projects/usb/src/sys/dev/usb2/include/usb2_standard.h#4 (text+ko) ====
@@ -412,6 +412,18 @@
/* deprecated */ uByte PortPowerCtrlMask[1];
} __packed;
+/* minimum HUB descriptor (8-ports maximum) */
+struct usb2_hub_descriptor_min {
+ uByte bDescLength;
+ uByte bDescriptorType;
+ uByte bNbrPorts;
+ uWord wHubCharacteristics;
+ uByte bPwrOn2PwrGood;
+ uByte bHubContrCurrent;
+ uByte DeviceRemovable[1];
+ uByte PortPowerCtrlMask[1];
+} __packed;
+
struct usb2_device_qualifier {
uByte bLength;
uByte bDescriptorType;
More information about the p4-projects
mailing list