Commit 47c6a04b authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge branch 'for-usb-linus' of git.kernel.org/pub/scm/linux/kernel/git/sarah/xhci into usb-linus

* 'for-usb-linus' of ra.kernel.org:/pub/scm/linux/kernel/git/sarah/xhci:
  usb, xhci: Clear warm reset change event during init
  xhci: Set slot and ep0 flags for address command.
  usb, xhci: fix lockdep warning on endpoint timeout
parents 1ea6b8f4 79c3dd81
...@@ -813,6 +813,12 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) ...@@ -813,6 +813,12 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
USB_PORT_FEAT_C_PORT_LINK_STATE); USB_PORT_FEAT_C_PORT_LINK_STATE);
} }
if ((portchange & USB_PORT_STAT_C_BH_RESET) &&
hub_is_superspeed(hub->hdev)) {
need_debounce_delay = true;
clear_port_feature(hub->hdev, port1,
USB_PORT_FEAT_C_BH_PORT_RESET);
}
/* We can forget about a "removed" device when there's a /* We can forget about a "removed" device when there's a
* physical disconnect or the connect status changes. * physical disconnect or the connect status changes.
*/ */
......
...@@ -982,7 +982,6 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud ...@@ -982,7 +982,6 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud
struct xhci_virt_device *dev; struct xhci_virt_device *dev;
struct xhci_ep_ctx *ep0_ctx; struct xhci_ep_ctx *ep0_ctx;
struct xhci_slot_ctx *slot_ctx; struct xhci_slot_ctx *slot_ctx;
struct xhci_input_control_ctx *ctrl_ctx;
u32 port_num; u32 port_num;
struct usb_device *top_dev; struct usb_device *top_dev;
...@@ -994,12 +993,8 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud ...@@ -994,12 +993,8 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud
return -EINVAL; return -EINVAL;
} }
ep0_ctx = xhci_get_ep_ctx(xhci, dev->in_ctx, 0); ep0_ctx = xhci_get_ep_ctx(xhci, dev->in_ctx, 0);
ctrl_ctx = xhci_get_input_control_ctx(xhci, dev->in_ctx);
slot_ctx = xhci_get_slot_ctx(xhci, dev->in_ctx); slot_ctx = xhci_get_slot_ctx(xhci, dev->in_ctx);
/* 2) New slot context and endpoint 0 context are valid*/
ctrl_ctx->add_flags = cpu_to_le32(SLOT_FLAG | EP0_FLAG);
/* 3) Only the control endpoint is valid - one endpoint context */ /* 3) Only the control endpoint is valid - one endpoint context */
slot_ctx->dev_info |= cpu_to_le32(LAST_CTX(1) | udev->route); slot_ctx->dev_info |= cpu_to_le32(LAST_CTX(1) | udev->route);
switch (udev->speed) { switch (udev->speed) {
......
...@@ -816,23 +816,24 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg) ...@@ -816,23 +816,24 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg)
struct xhci_ring *ring; struct xhci_ring *ring;
struct xhci_td *cur_td; struct xhci_td *cur_td;
int ret, i, j; int ret, i, j;
unsigned long flags;
ep = (struct xhci_virt_ep *) arg; ep = (struct xhci_virt_ep *) arg;
xhci = ep->xhci; xhci = ep->xhci;
spin_lock(&xhci->lock); spin_lock_irqsave(&xhci->lock, flags);
ep->stop_cmds_pending--; ep->stop_cmds_pending--;
if (xhci->xhc_state & XHCI_STATE_DYING) { if (xhci->xhc_state & XHCI_STATE_DYING) {
xhci_dbg(xhci, "Stop EP timer ran, but another timer marked " xhci_dbg(xhci, "Stop EP timer ran, but another timer marked "
"xHCI as DYING, exiting.\n"); "xHCI as DYING, exiting.\n");
spin_unlock(&xhci->lock); spin_unlock_irqrestore(&xhci->lock, flags);
return; return;
} }
if (!(ep->stop_cmds_pending == 0 && (ep->ep_state & EP_HALT_PENDING))) { if (!(ep->stop_cmds_pending == 0 && (ep->ep_state & EP_HALT_PENDING))) {
xhci_dbg(xhci, "Stop EP timer ran, but no command pending, " xhci_dbg(xhci, "Stop EP timer ran, but no command pending, "
"exiting.\n"); "exiting.\n");
spin_unlock(&xhci->lock); spin_unlock_irqrestore(&xhci->lock, flags);
return; return;
} }
...@@ -844,11 +845,11 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg) ...@@ -844,11 +845,11 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg)
xhci->xhc_state |= XHCI_STATE_DYING; xhci->xhc_state |= XHCI_STATE_DYING;
/* Disable interrupts from the host controller and start halting it */ /* Disable interrupts from the host controller and start halting it */
xhci_quiesce(xhci); xhci_quiesce(xhci);
spin_unlock(&xhci->lock); spin_unlock_irqrestore(&xhci->lock, flags);
ret = xhci_halt(xhci); ret = xhci_halt(xhci);
spin_lock(&xhci->lock); spin_lock_irqsave(&xhci->lock, flags);
if (ret < 0) { if (ret < 0) {
/* This is bad; the host is not responding to commands and it's /* This is bad; the host is not responding to commands and it's
* not allowing itself to be halted. At least interrupts are * not allowing itself to be halted. At least interrupts are
...@@ -896,7 +897,7 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg) ...@@ -896,7 +897,7 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg)
} }
} }
} }
spin_unlock(&xhci->lock); spin_unlock_irqrestore(&xhci->lock, flags);
xhci_dbg(xhci, "Calling usb_hc_died()\n"); xhci_dbg(xhci, "Calling usb_hc_died()\n");
usb_hc_died(xhci_to_hcd(xhci)->primary_hcd); usb_hc_died(xhci_to_hcd(xhci)->primary_hcd);
xhci_dbg(xhci, "xHCI host controller is dead.\n"); xhci_dbg(xhci, "xHCI host controller is dead.\n");
......
...@@ -3504,6 +3504,10 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) ...@@ -3504,6 +3504,10 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev)
/* Otherwise, update the control endpoint ring enqueue pointer. */ /* Otherwise, update the control endpoint ring enqueue pointer. */
else else
xhci_copy_ep0_dequeue_into_input_ctx(xhci, udev); xhci_copy_ep0_dequeue_into_input_ctx(xhci, udev);
ctrl_ctx = xhci_get_input_control_ctx(xhci, virt_dev->in_ctx);
ctrl_ctx->add_flags = cpu_to_le32(SLOT_FLAG | EP0_FLAG);
ctrl_ctx->drop_flags = 0;
xhci_dbg(xhci, "Slot ID %d Input Context:\n", udev->slot_id); xhci_dbg(xhci, "Slot ID %d Input Context:\n", udev->slot_id);
xhci_dbg_ctx(xhci, virt_dev->in_ctx, 2); xhci_dbg_ctx(xhci, virt_dev->in_ctx, 2);
...@@ -3585,7 +3589,6 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) ...@@ -3585,7 +3589,6 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev)
virt_dev->address = (le32_to_cpu(slot_ctx->dev_state) & DEV_ADDR_MASK) virt_dev->address = (le32_to_cpu(slot_ctx->dev_state) & DEV_ADDR_MASK)
+ 1; + 1;
/* Zero the input context control for later use */ /* Zero the input context control for later use */
ctrl_ctx = xhci_get_input_control_ctx(xhci, virt_dev->in_ctx);
ctrl_ctx->add_flags = 0; ctrl_ctx->add_flags = 0;
ctrl_ctx->drop_flags = 0; ctrl_ctx->drop_flags = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment