Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 235424
b: refs/heads/master
c: dbe79bb
h: refs/heads/master
v: v3
  • Loading branch information
John Youn authored and Sarah Sharp committed Mar 14, 2011
1 parent 0a1a97b commit 0990565
Show file tree
Hide file tree
Showing 18 changed files with 142 additions and 49 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ad73dff32e04cad1ff2af89512bf489224b503cc
refs/heads/master: dbe79bbe9dcb22cb3651c46f18943477141ca452
4 changes: 2 additions & 2 deletions trunk/drivers/staging/usbip/vhci_hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,8 +255,8 @@ static inline void hub_descriptor(struct usb_hub_descriptor *desc)
desc->wHubCharacteristics = (__force __u16)
(__constant_cpu_to_le16(0x0001));
desc->bNbrPorts = VHCI_NPORTS;
desc->DeviceRemovable[0] = 0xff;
desc->DeviceRemovable[1] = 0xff;
desc->u.hs.DeviceRemovable[0] = 0xff;
desc->u.hs.DeviceRemovable[1] = 0xff;
}

static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
Expand Down
73 changes: 65 additions & 8 deletions trunk/drivers/usb/core/hub.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,10 @@ struct usb_hub {
void **port_owners;
};

static inline int hub_is_superspeed(struct usb_device *hdev)
{
return (hdev->descriptor.bDeviceProtocol == 3);
}

/* Protect struct usb_device->state and ->children members
* Note: Both are also protected by ->dev.sem, except that ->state can
Expand Down Expand Up @@ -172,14 +176,23 @@ static struct usb_hub *hdev_to_hub(struct usb_device *hdev)
}

/* USB 2.0 spec Section 11.24.4.5 */
static int get_hub_descriptor(struct usb_device *hdev, void *data, int size)
static int get_hub_descriptor(struct usb_device *hdev, void *data)
{
int i, ret;
int i, ret, size;
unsigned dtype;

if (hub_is_superspeed(hdev)) {
dtype = USB_DT_SS_HUB;
size = USB_DT_SS_HUB_SIZE;
} else {
dtype = USB_DT_HUB;
size = sizeof(struct usb_hub_descriptor);
}

for (i = 0; i < 3; i++) {
ret = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0),
USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB,
USB_DT_HUB << 8, 0, data, size,
dtype << 8, 0, data, size,
USB_CTRL_GET_TIMEOUT);
if (ret >= (USB_DT_HUB_NONVAR_SIZE + 2))
return ret;
Expand Down Expand Up @@ -365,6 +378,19 @@ static int hub_port_status(struct usb_hub *hub, int port1,
} else {
*status = le16_to_cpu(hub->status->port.wPortStatus);
*change = le16_to_cpu(hub->status->port.wPortChange);

if ((hub->hdev->parent != NULL) &&
hub_is_superspeed(hub->hdev)) {
/* Translate the USB 3 port status */
u16 tmp = *status & USB_SS_PORT_STAT_MASK;
if (*status & USB_SS_PORT_STAT_POWER)
tmp |= USB_PORT_STAT_POWER;
if ((*status & USB_SS_PORT_STAT_SPEED) ==
USB_PORT_STAT_SPEED_5GBPS)
tmp |= USB_PORT_STAT_SUPER_SPEED;
*status = tmp;
}

ret = 0;
}
mutex_unlock(&hub->status_mutex);
Expand Down Expand Up @@ -607,7 +633,7 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state)
if (hdev->children[port1-1] && set_state)
usb_set_device_state(hdev->children[port1-1],
USB_STATE_NOTATTACHED);
if (!hub->error)
if (!hub->error && !hub_is_superspeed(hub->hdev))
ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE);
if (ret)
dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n",
Expand Down Expand Up @@ -795,6 +821,11 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
clear_port_feature(hub->hdev, port1,
USB_PORT_FEAT_C_ENABLE);
}
if (portchange & USB_PORT_STAT_C_LINK_STATE) {
need_debounce_delay = true;
clear_port_feature(hub->hdev, port1,
USB_PORT_FEAT_C_PORT_LINK_STATE);
}

/* We can forget about a "removed" device when there's a
* physical disconnect or the connect status changes.
Expand Down Expand Up @@ -964,12 +995,23 @@ static int hub_configure(struct usb_hub *hub,
goto fail;
}

if (hub_is_superspeed(hdev) && (hdev->parent != NULL)) {
ret = usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
HUB_SET_DEPTH, USB_RT_HUB,
hdev->level - 1, 0, NULL, 0,
USB_CTRL_SET_TIMEOUT);

if (ret < 0) {
message = "can't set hub depth";
goto fail;
}
}

/* Request the entire hub descriptor.
* hub->descriptor can handle USB_MAXCHILDREN ports,
* but the hub can/will return fewer bytes here.
*/
ret = get_hub_descriptor(hdev, hub->descriptor,
sizeof(*hub->descriptor));
ret = get_hub_descriptor(hdev, hub->descriptor);
if (ret < 0) {
message = "can't read hub descriptor";
goto fail;
Expand All @@ -991,12 +1033,14 @@ static int hub_configure(struct usb_hub *hub,

wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics);

if (wHubCharacteristics & HUB_CHAR_COMPOUND) {
/* FIXME for USB 3.0, skip for now */
if ((wHubCharacteristics & HUB_CHAR_COMPOUND) &&
!(hub_is_superspeed(hdev))) {
int i;
char portstr [USB_MAXCHILDREN + 1];

for (i = 0; i < hdev->maxchild; i++)
portstr[i] = hub->descriptor->DeviceRemovable
portstr[i] = hub->descriptor->u.hs.DeviceRemovable
[((i + 1) / 8)] & (1 << ((i + 1) % 8))
? 'F' : 'R';
portstr[hdev->maxchild] = 0;
Expand Down Expand Up @@ -2029,6 +2073,8 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,
udev->speed = USB_SPEED_HIGH;
else if (portstatus & USB_PORT_STAT_LOW_SPEED)
udev->speed = USB_SPEED_LOW;
else if (portstatus & USB_PORT_STAT_SUPER_SPEED)
udev->speed = USB_SPEED_SUPER;
else
udev->speed = USB_SPEED_FULL;
return 0;
Expand Down Expand Up @@ -3430,6 +3476,17 @@ static void hub_events(void)
clear_port_feature(hdev, i,
USB_PORT_FEAT_C_RESET);
}
if (portchange & USB_PORT_STAT_C_LINK_STATE) {
clear_port_feature(hub->hdev, i,
USB_PORT_FEAT_C_PORT_LINK_STATE);
}
if (portchange & USB_PORT_STAT_C_CONFIG_ERROR) {
dev_warn(hub_dev,
"config error on port %d\n",
i);
clear_port_feature(hub->hdev, i,
USB_PORT_FEAT_C_PORT_CONFIG_ERROR);
}

if (connect_change)
hub_port_connect_change(hub, i,
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/usb/gadget/dummy_hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1593,8 +1593,8 @@ hub_descriptor (struct usb_hub_descriptor *desc)
desc->bDescLength = 9;
desc->wHubCharacteristics = cpu_to_le16(0x0001);
desc->bNbrPorts = 1;
desc->DeviceRemovable[0] = 0xff;
desc->DeviceRemovable[1] = 0xff;
desc->u.hs.DeviceRemovable[0] = 0xff;
desc->u.hs.DeviceRemovable[1] = 0xff;
}

static int dummy_hub_control (
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/usb/host/ehci-hub.c
Original file line number Diff line number Diff line change
Expand Up @@ -717,8 +717,8 @@ ehci_hub_descriptor (
desc->bDescLength = 7 + 2 * temp;

/* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */
memset(&desc->DeviceRemovable[0], 0, temp);
memset(&desc->DeviceRemovable[temp], 0xff, temp);
memset(&desc->u.hs.DeviceRemovable[0], 0, temp);
memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp);

temp = 0x0008; /* per-port overcurrent reporting */
if (HCS_PPC (ehci->hcs_params))
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/usb/host/imx21-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1472,8 +1472,8 @@ static int get_hub_descriptor(struct usb_hcd *hcd,
0x0010 | /* No over current protection */
0);

desc->DeviceRemovable[0] = 1 << 1;
desc->DeviceRemovable[1] = ~0;
desc->u.hs.DeviceRemovable[0] = 1 << 1;
desc->u.hs.DeviceRemovable[1] = ~0;
return 0;
}

Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/usb/host/isp116x-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -952,8 +952,8 @@ static void isp116x_hub_descriptor(struct isp116x *isp116x,
desc->wHubCharacteristics = cpu_to_le16((u16) ((reg >> 8) & 0x1f));
desc->bPwrOn2PwrGood = (u8) ((reg >> 24) & 0xff);
/* ports removable, and legacy PortPwrCtrlMask */
desc->DeviceRemovable[0] = 0;
desc->DeviceRemovable[1] = ~0;
desc->u.hs.DeviceRemovable[0] = 0;
desc->u.hs.DeviceRemovable[1] = ~0;
}

/* Perform reset of a given port.
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/usb/host/isp1362-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1553,8 +1553,8 @@ static void isp1362_hub_descriptor(struct isp1362_hcd *isp1362_hcd,
DBG(0, "%s: hubcharacteristics = %02x\n", __func__, cpu_to_le16((reg >> 8) & 0x1f));
desc->bPwrOn2PwrGood = (reg >> 24) & 0xff;
/* ports removable, and legacy PortPwrCtrlMask */
desc->DeviceRemovable[0] = desc->bNbrPorts == 1 ? 1 << 1 : 3 << 1;
desc->DeviceRemovable[1] = ~0;
desc->u.hs.DeviceRemovable[0] = desc->bNbrPorts == 1 ? 1 << 1 : 3 << 1;
desc->u.hs.DeviceRemovable[1] = ~0;

DBG(3, "%s: exit\n", __func__);
}
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/usb/host/isp1760-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1752,8 +1752,8 @@ static void isp1760_hub_descriptor(struct isp1760_hcd *priv,
desc->bDescLength = 7 + 2 * temp;

/* ports removable, and usb 1.0 legacy PortPwrCtrlMask */
memset(&desc->DeviceRemovable[0], 0, temp);
memset(&desc->DeviceRemovable[temp], 0xff, temp);
memset(&desc->u.hs.DeviceRemovable[0], 0, temp);
memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp);

/* per-port overcurrent reporting */
temp = 0x0008;
Expand Down
11 changes: 6 additions & 5 deletions trunk/drivers/usb/host/ohci-hub.c
Original file line number Diff line number Diff line change
Expand Up @@ -582,13 +582,14 @@ ohci_hub_descriptor (

/* ports removable, and usb 1.0 legacy PortPwrCtrlMask */
rh = roothub_b (ohci);
memset(desc->DeviceRemovable, 0xff, sizeof(desc->DeviceRemovable));
desc->DeviceRemovable[0] = rh & RH_B_DR;
memset(desc->u.hs.DeviceRemovable, 0xff,
sizeof(desc->u.hs.DeviceRemovable));
desc->u.hs.DeviceRemovable[0] = rh & RH_B_DR;
if (ohci->num_ports > 7) {
desc->DeviceRemovable[1] = (rh & RH_B_DR) >> 8;
desc->DeviceRemovable[2] = 0xff;
desc->u.hs.DeviceRemovable[1] = (rh & RH_B_DR) >> 8;
desc->u.hs.DeviceRemovable[2] = 0xff;
} else
desc->DeviceRemovable[1] = 0xff;
desc->u.hs.DeviceRemovable[1] = 0xff;
}

/*-------------------------------------------------------------------------*/
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/usb/host/oxu210hp-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -452,8 +452,8 @@ static void ehci_hub_descriptor(struct oxu_hcd *oxu,
desc->bDescLength = 7 + 2 * temp;

/* ports removable, and usb 1.0 legacy PortPwrCtrlMask */
memset(&desc->DeviceRemovable[0], 0, temp);
memset(&desc->DeviceRemovable[temp], 0xff, temp);
memset(&desc->u.hs.DeviceRemovable[0], 0, temp);
memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp);

temp = 0x0008; /* per-port overcurrent reporting */
if (HCS_PPC(oxu->hcs_params))
Expand Down
5 changes: 3 additions & 2 deletions trunk/drivers/usb/host/r8a66597-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2150,8 +2150,9 @@ static void r8a66597_hub_descriptor(struct r8a66597 *r8a66597,
desc->bDescLength = 9;
desc->bPwrOn2PwrGood = 0;
desc->wHubCharacteristics = cpu_to_le16(0x0011);
desc->DeviceRemovable[0] = ((1 << r8a66597->max_root_hub) - 1) << 1;
desc->DeviceRemovable[1] = ~0;
desc->u.hs.DeviceRemovable[0] =
((1 << r8a66597->max_root_hub) - 1) << 1;
desc->u.hs.DeviceRemovable[1] = ~0;
}

static int r8a66597_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/usb/host/sl811-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1112,8 +1112,8 @@ sl811h_hub_descriptor (
desc->wHubCharacteristics = cpu_to_le16(temp);

/* ports removable, and legacy PortPwrCtrlMask */
desc->DeviceRemovable[0] = 0 << 1;
desc->DeviceRemovable[1] = ~0;
desc->u.hs.DeviceRemovable[0] = 0 << 1;
desc->u.hs.DeviceRemovable[1] = ~0;
}

static void
Expand Down
11 changes: 6 additions & 5 deletions trunk/drivers/usb/host/u132-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2604,13 +2604,14 @@ static int u132_roothub_descriptor(struct u132 *u132,
retval = u132_read_pcimem(u132, roothub.b, &rh_b);
if (retval)
return retval;
memset(desc->DeviceRemovable, 0xff, sizeof(desc->DeviceRemovable));
desc->DeviceRemovable[0] = rh_b & RH_B_DR;
memset(desc->u.hs.DeviceRemovable, 0xff,
sizeof(desc->u.hs.DeviceRemovable));
desc->u.hs.DeviceRemovable[0] = rh_b & RH_B_DR;
if (u132->num_ports > 7) {
desc->DeviceRemovable[1] = (rh_b & RH_B_DR) >> 8;
desc->DeviceRemovable[2] = 0xff;
desc->u.hs.DeviceRemovable[1] = (rh_b & RH_B_DR) >> 8;
desc->u.hs.DeviceRemovable[2] = 0xff;
} else
desc->DeviceRemovable[1] = 0xff;
desc->u.hs.DeviceRemovable[1] = 0xff;
return 0;
}

Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/usb/host/xhci-hub.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ static void xhci_hub_descriptor(struct xhci_hcd *xhci,
temp = 1 + (ports / 8);
desc->bDescLength = 7 + 2 * temp;

memset(&desc->DeviceRemovable[0], 0, temp);
memset(&desc->DeviceRemovable[temp], 0xff, temp);
memset(&desc->u.hs.DeviceRemovable[0], 0, temp);
memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp);

/* Ugh, these should be #defines, FIXME */
/* Using table 11-13 in USB 2.0 spec. */
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/usb/musb/musb_virthub.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,8 +305,8 @@ int musb_hub_control(
desc->bHubContrCurrent = 0;

/* workaround bogus struct definition */
desc->DeviceRemovable[0] = 0x02; /* port 1 */
desc->DeviceRemovable[1] = 0xff;
desc->u.hs.DeviceRemovable[0] = 0x02; /* port 1 */
desc->u.hs.DeviceRemovable[1] = 0xff;
}
break;
case GetHubStatus:
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/usb/wusbcore/rh.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,8 @@ static int wusbhc_rh_get_hub_descr(struct wusbhc *wusbhc, u16 wValue,
descr->bPwrOn2PwrGood = 0;
descr->bHubContrCurrent = 0;
/* two bitmaps: ports removable, and usb 1.0 legacy PortPwrCtrlMask */
memset(&descr->DeviceRemovable[0], 0, temp);
memset(&descr->DeviceRemovable[temp], 0xff, temp);
memset(&descr->u.hs.DeviceRemovable[0], 0, temp);
memset(&descr->u.hs.DeviceRemovable[temp], 0xff, temp);
return 0;
}

Expand Down
Loading

0 comments on commit 0990565

Please sign in to comment.