diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/usbip/vhci_hcd.c | 4 | ||||
-rw-r--r-- | drivers/usb/core/hub.c | 73 | ||||
-rw-r--r-- | drivers/usb/gadget/dummy_hcd.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/ehci-hub.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/imx21-hcd.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/isp116x-hcd.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/isp1362-hcd.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/isp1760-hcd.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/ohci-hub.c | 11 | ||||
-rw-r--r-- | drivers/usb/host/oxu210hp-hcd.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/r8a66597-hcd.c | 5 | ||||
-rw-r--r-- | drivers/usb/host/sl811-hcd.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/u132-hcd.c | 11 | ||||
-rw-r--r-- | drivers/usb/host/xhci-hub.c | 4 | ||||
-rw-r--r-- | drivers/usb/musb/musb_virthub.c | 4 | ||||
-rw-r--r-- | drivers/usb/wusbcore/rh.c | 4 |
16 files changed, 104 insertions, 44 deletions
diff --git a/drivers/staging/usbip/vhci_hcd.c b/drivers/staging/usbip/vhci_hcd.c index 0fe7e49cdc3..29ccc015099 100644 --- a/drivers/staging/usbip/vhci_hcd.c +++ b/drivers/staging/usbip/vhci_hcd.c | |||
@@ -255,8 +255,8 @@ static inline void hub_descriptor(struct usb_hub_descriptor *desc) | |||
255 | desc->wHubCharacteristics = (__force __u16) | 255 | desc->wHubCharacteristics = (__force __u16) |
256 | (__constant_cpu_to_le16(0x0001)); | 256 | (__constant_cpu_to_le16(0x0001)); |
257 | desc->bNbrPorts = VHCI_NPORTS; | 257 | desc->bNbrPorts = VHCI_NPORTS; |
258 | desc->DeviceRemovable[0] = 0xff; | 258 | desc->u.hs.DeviceRemovable[0] = 0xff; |
259 | desc->DeviceRemovable[1] = 0xff; | 259 | desc->u.hs.DeviceRemovable[1] = 0xff; |
260 | } | 260 | } |
261 | 261 | ||
262 | static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | 262 | static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index b574f9131b4..feb6e596c7c 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -82,6 +82,10 @@ struct usb_hub { | |||
82 | void **port_owners; | 82 | void **port_owners; |
83 | }; | 83 | }; |
84 | 84 | ||
85 | static inline int hub_is_superspeed(struct usb_device *hdev) | ||
86 | { | ||
87 | return (hdev->descriptor.bDeviceProtocol == 3); | ||
88 | } | ||
85 | 89 | ||
86 | /* Protect struct usb_device->state and ->children members | 90 | /* Protect struct usb_device->state and ->children members |
87 | * Note: Both are also protected by ->dev.sem, except that ->state can | 91 | * Note: Both are also protected by ->dev.sem, except that ->state can |
@@ -172,14 +176,23 @@ static struct usb_hub *hdev_to_hub(struct usb_device *hdev) | |||
172 | } | 176 | } |
173 | 177 | ||
174 | /* USB 2.0 spec Section 11.24.4.5 */ | 178 | /* USB 2.0 spec Section 11.24.4.5 */ |
175 | static int get_hub_descriptor(struct usb_device *hdev, void *data, int size) | 179 | static int get_hub_descriptor(struct usb_device *hdev, void *data) |
176 | { | 180 | { |
177 | int i, ret; | 181 | int i, ret, size; |
182 | unsigned dtype; | ||
183 | |||
184 | if (hub_is_superspeed(hdev)) { | ||
185 | dtype = USB_DT_SS_HUB; | ||
186 | size = USB_DT_SS_HUB_SIZE; | ||
187 | } else { | ||
188 | dtype = USB_DT_HUB; | ||
189 | size = sizeof(struct usb_hub_descriptor); | ||
190 | } | ||
178 | 191 | ||
179 | for (i = 0; i < 3; i++) { | 192 | for (i = 0; i < 3; i++) { |
180 | ret = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), | 193 | ret = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), |
181 | USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB, | 194 | USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB, |
182 | USB_DT_HUB << 8, 0, data, size, | 195 | dtype << 8, 0, data, size, |
183 | USB_CTRL_GET_TIMEOUT); | 196 | USB_CTRL_GET_TIMEOUT); |
184 | if (ret >= (USB_DT_HUB_NONVAR_SIZE + 2)) | 197 | if (ret >= (USB_DT_HUB_NONVAR_SIZE + 2)) |
185 | return ret; | 198 | return ret; |
@@ -365,6 +378,19 @@ static int hub_port_status(struct usb_hub *hub, int port1, | |||
365 | } else { | 378 | } else { |
366 | *status = le16_to_cpu(hub->status->port.wPortStatus); | 379 | *status = le16_to_cpu(hub->status->port.wPortStatus); |
367 | *change = le16_to_cpu(hub->status->port.wPortChange); | 380 | *change = le16_to_cpu(hub->status->port.wPortChange); |
381 | |||
382 | if ((hub->hdev->parent != NULL) && | ||
383 | hub_is_superspeed(hub->hdev)) { | ||
384 | /* Translate the USB 3 port status */ | ||
385 | u16 tmp = *status & USB_SS_PORT_STAT_MASK; | ||
386 | if (*status & USB_SS_PORT_STAT_POWER) | ||
387 | tmp |= USB_PORT_STAT_POWER; | ||
388 | if ((*status & USB_SS_PORT_STAT_SPEED) == | ||
389 | USB_PORT_STAT_SPEED_5GBPS) | ||
390 | tmp |= USB_PORT_STAT_SUPER_SPEED; | ||
391 | *status = tmp; | ||
392 | } | ||
393 | |||
368 | ret = 0; | 394 | ret = 0; |
369 | } | 395 | } |
370 | mutex_unlock(&hub->status_mutex); | 396 | mutex_unlock(&hub->status_mutex); |
@@ -607,7 +633,7 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | |||
607 | if (hdev->children[port1-1] && set_state) | 633 | if (hdev->children[port1-1] && set_state) |
608 | usb_set_device_state(hdev->children[port1-1], | 634 | usb_set_device_state(hdev->children[port1-1], |
609 | USB_STATE_NOTATTACHED); | 635 | USB_STATE_NOTATTACHED); |
610 | if (!hub->error) | 636 | if (!hub->error && !hub_is_superspeed(hub->hdev)) |
611 | ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE); | 637 | ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE); |
612 | if (ret) | 638 | if (ret) |
613 | dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", | 639 | dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", |
@@ -795,6 +821,11 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) | |||
795 | clear_port_feature(hub->hdev, port1, | 821 | clear_port_feature(hub->hdev, port1, |
796 | USB_PORT_FEAT_C_ENABLE); | 822 | USB_PORT_FEAT_C_ENABLE); |
797 | } | 823 | } |
824 | if (portchange & USB_PORT_STAT_C_LINK_STATE) { | ||
825 | need_debounce_delay = true; | ||
826 | clear_port_feature(hub->hdev, port1, | ||
827 | USB_PORT_FEAT_C_PORT_LINK_STATE); | ||
828 | } | ||
798 | 829 | ||
799 | /* We can forget about a "removed" device when there's a | 830 | /* We can forget about a "removed" device when there's a |
800 | * physical disconnect or the connect status changes. | 831 | * physical disconnect or the connect status changes. |
@@ -964,12 +995,23 @@ static int hub_configure(struct usb_hub *hub, | |||
964 | goto fail; | 995 | goto fail; |
965 | } | 996 | } |
966 | 997 | ||
998 | if (hub_is_superspeed(hdev) && (hdev->parent != NULL)) { | ||
999 | ret = usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), | ||
1000 | HUB_SET_DEPTH, USB_RT_HUB, | ||
1001 | hdev->level - 1, 0, NULL, 0, | ||
1002 | USB_CTRL_SET_TIMEOUT); | ||
1003 | |||
1004 | if (ret < 0) { | ||
1005 | message = "can't set hub depth"; | ||
1006 | goto fail; | ||
1007 | } | ||
1008 | } | ||
1009 | |||
967 | /* Request the entire hub descriptor. | 1010 | /* Request the entire hub descriptor. |
968 | * hub->descriptor can handle USB_MAXCHILDREN ports, | 1011 | * hub->descriptor can handle USB_MAXCHILDREN ports, |
969 | * but the hub can/will return fewer bytes here. | 1012 | * but the hub can/will return fewer bytes here. |
970 | */ | 1013 | */ |
971 | ret = get_hub_descriptor(hdev, hub->descriptor, | 1014 | ret = get_hub_descriptor(hdev, hub->descriptor); |
972 | sizeof(*hub->descriptor)); | ||
973 | if (ret < 0) { | 1015 | if (ret < 0) { |
974 | message = "can't read hub descriptor"; | 1016 | message = "can't read hub descriptor"; |
975 | goto fail; | 1017 | goto fail; |
@@ -991,12 +1033,14 @@ static int hub_configure(struct usb_hub *hub, | |||
991 | 1033 | ||
992 | wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics); | 1034 | wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics); |
993 | 1035 | ||
994 | if (wHubCharacteristics & HUB_CHAR_COMPOUND) { | 1036 | /* FIXME for USB 3.0, skip for now */ |
1037 | if ((wHubCharacteristics & HUB_CHAR_COMPOUND) && | ||
1038 | !(hub_is_superspeed(hdev))) { | ||
995 | int i; | 1039 | int i; |
996 | char portstr [USB_MAXCHILDREN + 1]; | 1040 | char portstr [USB_MAXCHILDREN + 1]; |
997 | 1041 | ||
998 | for (i = 0; i < hdev->maxchild; i++) | 1042 | for (i = 0; i < hdev->maxchild; i++) |
999 | portstr[i] = hub->descriptor->DeviceRemovable | 1043 | portstr[i] = hub->descriptor->u.hs.DeviceRemovable |
1000 | [((i + 1) / 8)] & (1 << ((i + 1) % 8)) | 1044 | [((i + 1) / 8)] & (1 << ((i + 1) % 8)) |
1001 | ? 'F' : 'R'; | 1045 | ? 'F' : 'R'; |
1002 | portstr[hdev->maxchild] = 0; | 1046 | portstr[hdev->maxchild] = 0; |
@@ -2029,6 +2073,8 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1, | |||
2029 | udev->speed = USB_SPEED_HIGH; | 2073 | udev->speed = USB_SPEED_HIGH; |
2030 | else if (portstatus & USB_PORT_STAT_LOW_SPEED) | 2074 | else if (portstatus & USB_PORT_STAT_LOW_SPEED) |
2031 | udev->speed = USB_SPEED_LOW; | 2075 | udev->speed = USB_SPEED_LOW; |
2076 | else if (portstatus & USB_PORT_STAT_SUPER_SPEED) | ||
2077 | udev->speed = USB_SPEED_SUPER; | ||
2032 | else | 2078 | else |
2033 | udev->speed = USB_SPEED_FULL; | 2079 | udev->speed = USB_SPEED_FULL; |
2034 | return 0; | 2080 | return 0; |
@@ -3430,6 +3476,17 @@ static void hub_events(void) | |||
3430 | clear_port_feature(hdev, i, | 3476 | clear_port_feature(hdev, i, |
3431 | USB_PORT_FEAT_C_RESET); | 3477 | USB_PORT_FEAT_C_RESET); |
3432 | } | 3478 | } |
3479 | if (portchange & USB_PORT_STAT_C_LINK_STATE) { | ||
3480 | clear_port_feature(hub->hdev, i, | ||
3481 | USB_PORT_FEAT_C_PORT_LINK_STATE); | ||
3482 | } | ||
3483 | if (portchange & USB_PORT_STAT_C_CONFIG_ERROR) { | ||
3484 | dev_warn(hub_dev, | ||
3485 | "config error on port %d\n", | ||
3486 | i); | ||
3487 | clear_port_feature(hub->hdev, i, | ||
3488 | USB_PORT_FEAT_C_PORT_CONFIG_ERROR); | ||
3489 | } | ||
3433 | 3490 | ||
3434 | if (connect_change) | 3491 | if (connect_change) |
3435 | hub_port_connect_change(hub, i, | 3492 | hub_port_connect_change(hub, i, |
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index f2040e8af8b..3214ca375d6 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
@@ -1593,8 +1593,8 @@ hub_descriptor (struct usb_hub_descriptor *desc) | |||
1593 | desc->bDescLength = 9; | 1593 | desc->bDescLength = 9; |
1594 | desc->wHubCharacteristics = cpu_to_le16(0x0001); | 1594 | desc->wHubCharacteristics = cpu_to_le16(0x0001); |
1595 | desc->bNbrPorts = 1; | 1595 | desc->bNbrPorts = 1; |
1596 | desc->DeviceRemovable[0] = 0xff; | 1596 | desc->u.hs.DeviceRemovable[0] = 0xff; |
1597 | desc->DeviceRemovable[1] = 0xff; | 1597 | desc->u.hs.DeviceRemovable[1] = 0xff; |
1598 | } | 1598 | } |
1599 | 1599 | ||
1600 | static int dummy_hub_control ( | 1600 | static int dummy_hub_control ( |
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index dfa1e1d371c..d05ea03cfb4 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -717,8 +717,8 @@ ehci_hub_descriptor ( | |||
717 | desc->bDescLength = 7 + 2 * temp; | 717 | desc->bDescLength = 7 + 2 * temp; |
718 | 718 | ||
719 | /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */ | 719 | /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */ |
720 | memset(&desc->DeviceRemovable[0], 0, temp); | 720 | memset(&desc->u.hs.DeviceRemovable[0], 0, temp); |
721 | memset(&desc->DeviceRemovable[temp], 0xff, temp); | 721 | memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp); |
722 | 722 | ||
723 | temp = 0x0008; /* per-port overcurrent reporting */ | 723 | temp = 0x0008; /* per-port overcurrent reporting */ |
724 | if (HCS_PPC (ehci->hcs_params)) | 724 | if (HCS_PPC (ehci->hcs_params)) |
diff --git a/drivers/usb/host/imx21-hcd.c b/drivers/usb/host/imx21-hcd.c index 2f180dfe537..2562e92e317 100644 --- a/drivers/usb/host/imx21-hcd.c +++ b/drivers/usb/host/imx21-hcd.c | |||
@@ -1472,8 +1472,8 @@ static int get_hub_descriptor(struct usb_hcd *hcd, | |||
1472 | 0x0010 | /* No over current protection */ | 1472 | 0x0010 | /* No over current protection */ |
1473 | 0); | 1473 | 0); |
1474 | 1474 | ||
1475 | desc->DeviceRemovable[0] = 1 << 1; | 1475 | desc->u.hs.DeviceRemovable[0] = 1 << 1; |
1476 | desc->DeviceRemovable[1] = ~0; | 1476 | desc->u.hs.DeviceRemovable[1] = ~0; |
1477 | return 0; | 1477 | return 0; |
1478 | } | 1478 | } |
1479 | 1479 | ||
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index 2a60a50bc42..c0e22f26da1 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c | |||
@@ -952,8 +952,8 @@ static void isp116x_hub_descriptor(struct isp116x *isp116x, | |||
952 | desc->wHubCharacteristics = cpu_to_le16((u16) ((reg >> 8) & 0x1f)); | 952 | desc->wHubCharacteristics = cpu_to_le16((u16) ((reg >> 8) & 0x1f)); |
953 | desc->bPwrOn2PwrGood = (u8) ((reg >> 24) & 0xff); | 953 | desc->bPwrOn2PwrGood = (u8) ((reg >> 24) & 0xff); |
954 | /* ports removable, and legacy PortPwrCtrlMask */ | 954 | /* ports removable, and legacy PortPwrCtrlMask */ |
955 | desc->DeviceRemovable[0] = 0; | 955 | desc->u.hs.DeviceRemovable[0] = 0; |
956 | desc->DeviceRemovable[1] = ~0; | 956 | desc->u.hs.DeviceRemovable[1] = ~0; |
957 | } | 957 | } |
958 | 958 | ||
959 | /* Perform reset of a given port. | 959 | /* Perform reset of a given port. |
diff --git a/drivers/usb/host/isp1362-hcd.c b/drivers/usb/host/isp1362-hcd.c index 6dd94b997d9..662cd002adf 100644 --- a/drivers/usb/host/isp1362-hcd.c +++ b/drivers/usb/host/isp1362-hcd.c | |||
@@ -1553,8 +1553,8 @@ static void isp1362_hub_descriptor(struct isp1362_hcd *isp1362_hcd, | |||
1553 | DBG(0, "%s: hubcharacteristics = %02x\n", __func__, cpu_to_le16((reg >> 8) & 0x1f)); | 1553 | DBG(0, "%s: hubcharacteristics = %02x\n", __func__, cpu_to_le16((reg >> 8) & 0x1f)); |
1554 | desc->bPwrOn2PwrGood = (reg >> 24) & 0xff; | 1554 | desc->bPwrOn2PwrGood = (reg >> 24) & 0xff; |
1555 | /* ports removable, and legacy PortPwrCtrlMask */ | 1555 | /* ports removable, and legacy PortPwrCtrlMask */ |
1556 | desc->DeviceRemovable[0] = desc->bNbrPorts == 1 ? 1 << 1 : 3 << 1; | 1556 | desc->u.hs.DeviceRemovable[0] = desc->bNbrPorts == 1 ? 1 << 1 : 3 << 1; |
1557 | desc->DeviceRemovable[1] = ~0; | 1557 | desc->u.hs.DeviceRemovable[1] = ~0; |
1558 | 1558 | ||
1559 | DBG(3, "%s: exit\n", __func__); | 1559 | DBG(3, "%s: exit\n", __func__); |
1560 | } | 1560 | } |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index 1c8de7666d6..f50e84ac570 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
@@ -1752,8 +1752,8 @@ static void isp1760_hub_descriptor(struct isp1760_hcd *priv, | |||
1752 | desc->bDescLength = 7 + 2 * temp; | 1752 | desc->bDescLength = 7 + 2 * temp; |
1753 | 1753 | ||
1754 | /* ports removable, and usb 1.0 legacy PortPwrCtrlMask */ | 1754 | /* ports removable, and usb 1.0 legacy PortPwrCtrlMask */ |
1755 | memset(&desc->DeviceRemovable[0], 0, temp); | 1755 | memset(&desc->u.hs.DeviceRemovable[0], 0, temp); |
1756 | memset(&desc->DeviceRemovable[temp], 0xff, temp); | 1756 | memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp); |
1757 | 1757 | ||
1758 | /* per-port overcurrent reporting */ | 1758 | /* per-port overcurrent reporting */ |
1759 | temp = 0x0008; | 1759 | temp = 0x0008; |
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index cd4b74f27d0..9154615292d 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -582,13 +582,14 @@ ohci_hub_descriptor ( | |||
582 | 582 | ||
583 | /* ports removable, and usb 1.0 legacy PortPwrCtrlMask */ | 583 | /* ports removable, and usb 1.0 legacy PortPwrCtrlMask */ |
584 | rh = roothub_b (ohci); | 584 | rh = roothub_b (ohci); |
585 | memset(desc->DeviceRemovable, 0xff, sizeof(desc->DeviceRemovable)); | 585 | memset(desc->u.hs.DeviceRemovable, 0xff, |
586 | desc->DeviceRemovable[0] = rh & RH_B_DR; | 586 | sizeof(desc->u.hs.DeviceRemovable)); |
587 | desc->u.hs.DeviceRemovable[0] = rh & RH_B_DR; | ||
587 | if (ohci->num_ports > 7) { | 588 | if (ohci->num_ports > 7) { |
588 | desc->DeviceRemovable[1] = (rh & RH_B_DR) >> 8; | 589 | desc->u.hs.DeviceRemovable[1] = (rh & RH_B_DR) >> 8; |
589 | desc->DeviceRemovable[2] = 0xff; | 590 | desc->u.hs.DeviceRemovable[2] = 0xff; |
590 | } else | 591 | } else |
591 | desc->DeviceRemovable[1] = 0xff; | 592 | desc->u.hs.DeviceRemovable[1] = 0xff; |
592 | } | 593 | } |
593 | 594 | ||
594 | /*-------------------------------------------------------------------------*/ | 595 | /*-------------------------------------------------------------------------*/ |
diff --git a/drivers/usb/host/oxu210hp-hcd.c b/drivers/usb/host/oxu210hp-hcd.c index ad54a414475..38193f4e980 100644 --- a/drivers/usb/host/oxu210hp-hcd.c +++ b/drivers/usb/host/oxu210hp-hcd.c | |||
@@ -452,8 +452,8 @@ static void ehci_hub_descriptor(struct oxu_hcd *oxu, | |||
452 | desc->bDescLength = 7 + 2 * temp; | 452 | desc->bDescLength = 7 + 2 * temp; |
453 | 453 | ||
454 | /* ports removable, and usb 1.0 legacy PortPwrCtrlMask */ | 454 | /* ports removable, and usb 1.0 legacy PortPwrCtrlMask */ |
455 | memset(&desc->DeviceRemovable[0], 0, temp); | 455 | memset(&desc->u.hs.DeviceRemovable[0], 0, temp); |
456 | memset(&desc->DeviceRemovable[temp], 0xff, temp); | 456 | memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp); |
457 | 457 | ||
458 | temp = 0x0008; /* per-port overcurrent reporting */ | 458 | temp = 0x0008; /* per-port overcurrent reporting */ |
459 | if (HCS_PPC(oxu->hcs_params)) | 459 | if (HCS_PPC(oxu->hcs_params)) |
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index 98afe75500c..db6f8b9c19b 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
@@ -2150,8 +2150,9 @@ static void r8a66597_hub_descriptor(struct r8a66597 *r8a66597, | |||
2150 | desc->bDescLength = 9; | 2150 | desc->bDescLength = 9; |
2151 | desc->bPwrOn2PwrGood = 0; | 2151 | desc->bPwrOn2PwrGood = 0; |
2152 | desc->wHubCharacteristics = cpu_to_le16(0x0011); | 2152 | desc->wHubCharacteristics = cpu_to_le16(0x0011); |
2153 | desc->DeviceRemovable[0] = ((1 << r8a66597->max_root_hub) - 1) << 1; | 2153 | desc->u.hs.DeviceRemovable[0] = |
2154 | desc->DeviceRemovable[1] = ~0; | 2154 | ((1 << r8a66597->max_root_hub) - 1) << 1; |
2155 | desc->u.hs.DeviceRemovable[1] = ~0; | ||
2155 | } | 2156 | } |
2156 | 2157 | ||
2157 | static int r8a66597_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | 2158 | static int r8a66597_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, |
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index f3899b334c7..18b7099a812 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c | |||
@@ -1112,8 +1112,8 @@ sl811h_hub_descriptor ( | |||
1112 | desc->wHubCharacteristics = cpu_to_le16(temp); | 1112 | desc->wHubCharacteristics = cpu_to_le16(temp); |
1113 | 1113 | ||
1114 | /* ports removable, and legacy PortPwrCtrlMask */ | 1114 | /* ports removable, and legacy PortPwrCtrlMask */ |
1115 | desc->DeviceRemovable[0] = 0 << 1; | 1115 | desc->u.hs.DeviceRemovable[0] = 0 << 1; |
1116 | desc->DeviceRemovable[1] = ~0; | 1116 | desc->u.hs.DeviceRemovable[1] = ~0; |
1117 | } | 1117 | } |
1118 | 1118 | ||
1119 | static void | 1119 | static void |
diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c index a659e1590bc..b4785934e09 100644 --- a/drivers/usb/host/u132-hcd.c +++ b/drivers/usb/host/u132-hcd.c | |||
@@ -2604,13 +2604,14 @@ static int u132_roothub_descriptor(struct u132 *u132, | |||
2604 | retval = u132_read_pcimem(u132, roothub.b, &rh_b); | 2604 | retval = u132_read_pcimem(u132, roothub.b, &rh_b); |
2605 | if (retval) | 2605 | if (retval) |
2606 | return retval; | 2606 | return retval; |
2607 | memset(desc->DeviceRemovable, 0xff, sizeof(desc->DeviceRemovable)); | 2607 | memset(desc->u.hs.DeviceRemovable, 0xff, |
2608 | desc->DeviceRemovable[0] = rh_b & RH_B_DR; | 2608 | sizeof(desc->u.hs.DeviceRemovable)); |
2609 | desc->u.hs.DeviceRemovable[0] = rh_b & RH_B_DR; | ||
2609 | if (u132->num_ports > 7) { | 2610 | if (u132->num_ports > 7) { |
2610 | desc->DeviceRemovable[1] = (rh_b & RH_B_DR) >> 8; | 2611 | desc->u.hs.DeviceRemovable[1] = (rh_b & RH_B_DR) >> 8; |
2611 | desc->DeviceRemovable[2] = 0xff; | 2612 | desc->u.hs.DeviceRemovable[2] = 0xff; |
2612 | } else | 2613 | } else |
2613 | desc->DeviceRemovable[1] = 0xff; | 2614 | desc->u.hs.DeviceRemovable[1] = 0xff; |
2614 | return 0; | 2615 | return 0; |
2615 | } | 2616 | } |
2616 | 2617 | ||
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 43e0a099d63..847b071b6fc 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c | |||
@@ -45,8 +45,8 @@ static void xhci_hub_descriptor(struct xhci_hcd *xhci, | |||
45 | temp = 1 + (ports / 8); | 45 | temp = 1 + (ports / 8); |
46 | desc->bDescLength = 7 + 2 * temp; | 46 | desc->bDescLength = 7 + 2 * temp; |
47 | 47 | ||
48 | memset(&desc->DeviceRemovable[0], 0, temp); | 48 | memset(&desc->u.hs.DeviceRemovable[0], 0, temp); |
49 | memset(&desc->DeviceRemovable[temp], 0xff, temp); | 49 | memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp); |
50 | 50 | ||
51 | /* Ugh, these should be #defines, FIXME */ | 51 | /* Ugh, these should be #defines, FIXME */ |
52 | /* Using table 11-13 in USB 2.0 spec. */ | 52 | /* Using table 11-13 in USB 2.0 spec. */ |
diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c index b46d1877e28..489104a5ae1 100644 --- a/drivers/usb/musb/musb_virthub.c +++ b/drivers/usb/musb/musb_virthub.c | |||
@@ -305,8 +305,8 @@ int musb_hub_control( | |||
305 | desc->bHubContrCurrent = 0; | 305 | desc->bHubContrCurrent = 0; |
306 | 306 | ||
307 | /* workaround bogus struct definition */ | 307 | /* workaround bogus struct definition */ |
308 | desc->DeviceRemovable[0] = 0x02; /* port 1 */ | 308 | desc->u.hs.DeviceRemovable[0] = 0x02; /* port 1 */ |
309 | desc->DeviceRemovable[1] = 0xff; | 309 | desc->u.hs.DeviceRemovable[1] = 0xff; |
310 | } | 310 | } |
311 | break; | 311 | break; |
312 | case GetHubStatus: | 312 | case GetHubStatus: |
diff --git a/drivers/usb/wusbcore/rh.c b/drivers/usb/wusbcore/rh.c index cff246b7cb2..c175b7300c7 100644 --- a/drivers/usb/wusbcore/rh.c +++ b/drivers/usb/wusbcore/rh.c | |||
@@ -184,8 +184,8 @@ static int wusbhc_rh_get_hub_descr(struct wusbhc *wusbhc, u16 wValue, | |||
184 | descr->bPwrOn2PwrGood = 0; | 184 | descr->bPwrOn2PwrGood = 0; |
185 | descr->bHubContrCurrent = 0; | 185 | descr->bHubContrCurrent = 0; |
186 | /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */ | 186 | /* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */ |
187 | memset(&descr->DeviceRemovable[0], 0, temp); | 187 | memset(&descr->u.hs.DeviceRemovable[0], 0, temp); |
188 | memset(&descr->DeviceRemovable[temp], 0xff, temp); | 188 | memset(&descr->u.hs.DeviceRemovable[temp], 0xff, temp); |
189 | return 0; | 189 | return 0; |
190 | } | 190 | } |
191 | 191 | ||