xhci: Use completion and status in global command queue
Remove the per-device command list and handle_cmd_in_cmd_wait_list() and use the completion and status variables found in the command structure in the global command list. Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

부모
c9aa1a2de4
커밋
9ea1833e4c
@@ -2626,8 +2626,6 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
list_add_tail(&command->cmd_list, &virt_dev->cmd_list);
|
||||
|
||||
if (!ctx_change)
|
||||
ret = xhci_queue_configure_endpoint(xhci, command,
|
||||
command->in_ctx->dma,
|
||||
@@ -2637,7 +2635,6 @@ static int xhci_configure_endpoint(struct xhci_hcd *xhci,
|
||||
command->in_ctx->dma,
|
||||
udev->slot_id, must_succeed);
|
||||
if (ret < 0) {
|
||||
list_del(&command->cmd_list);
|
||||
if ((xhci->quirks & XHCI_EP_LIMIT_QUIRK))
|
||||
xhci_free_host_resources(xhci, ctrl_ctx);
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
@@ -3499,11 +3496,9 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev)
|
||||
/* Attempt to submit the Reset Device command to the command ring */
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
|
||||
list_add_tail(&reset_device_cmd->cmd_list, &virt_dev->cmd_list);
|
||||
ret = xhci_queue_reset_device(xhci, reset_device_cmd, slot_id);
|
||||
if (ret) {
|
||||
xhci_dbg(xhci, "FIXME: allocate a command ring segment\n");
|
||||
list_del(&reset_device_cmd->cmd_list);
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
goto command_cleanup;
|
||||
}
|
||||
@@ -3517,13 +3512,6 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev)
|
||||
if (timeleft <= 0) {
|
||||
xhci_warn(xhci, "%s while waiting for reset device command\n",
|
||||
timeleft == 0 ? "Timeout" : "Signal");
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
/* The timeout might have raced with the event ring handler, so
|
||||
* only delete from the list if the item isn't poisoned.
|
||||
*/
|
||||
if (reset_device_cmd->cmd_list.next != LIST_POISON1)
|
||||
list_del(&reset_device_cmd->cmd_list);
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
ret = -ETIME;
|
||||
goto command_cleanup;
|
||||
}
|
||||
@@ -3895,7 +3883,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
||||
return -ETIME;
|
||||
}
|
||||
|
||||
switch (virt_dev->cmd_status) {
|
||||
switch (command->status) {
|
||||
case COMP_CTX_STATE:
|
||||
case COMP_EBADSLT:
|
||||
xhci_err(xhci, "Setup ERROR: setup %s command for slot %d.\n",
|
||||
@@ -3918,7 +3906,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
||||
default:
|
||||
xhci_err(xhci,
|
||||
"ERROR: unexpected setup %s command completion code 0x%x.\n",
|
||||
act, virt_dev->cmd_status);
|
||||
act, command->status);
|
||||
xhci_dbg(xhci, "Slot ID %d Output Context:\n", udev->slot_id);
|
||||
xhci_dbg_ctx(xhci, virt_dev->out_ctx, 2);
|
||||
trace_xhci_address_ctx(xhci, virt_dev->out_ctx, 1);
|
||||
|
Reference in New Issue
Block a user