Commit 92f8e767 authored by Sarah Sharp's avatar Sarah Sharp

xhci: Remove BUG_ON in xhci_get_input_control_ctx.

Fail gracefully, instead of causing the kernel to panic, if the input
control context doesn't have the right type (XHCI_CTX_TYPE_INPUT).  Push
finding the pointer to the input control context up into functions that
can fail.
Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
Cc: John Youn <johnyoun@synopsys.com>
parent 29f9d54b
...@@ -553,6 +553,11 @@ void xhci_dbg_ctx(struct xhci_hcd *xhci, ...@@ -553,6 +553,11 @@ void xhci_dbg_ctx(struct xhci_hcd *xhci,
if (ctx->type == XHCI_CTX_TYPE_INPUT) { if (ctx->type == XHCI_CTX_TYPE_INPUT) {
struct xhci_input_control_ctx *ctrl_ctx = struct xhci_input_control_ctx *ctrl_ctx =
xhci_get_input_control_ctx(xhci, ctx); xhci_get_input_control_ctx(xhci, ctx);
if (!ctrl_ctx) {
xhci_warn(xhci, "Could not get input context, bad type.\n");
return;
}
xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - drop flags\n", xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - drop flags\n",
&ctrl_ctx->drop_flags, (unsigned long long)dma, &ctrl_ctx->drop_flags, (unsigned long long)dma,
ctrl_ctx->drop_flags); ctrl_ctx->drop_flags);
......
...@@ -389,7 +389,9 @@ static void xhci_free_container_ctx(struct xhci_hcd *xhci, ...@@ -389,7 +389,9 @@ static void xhci_free_container_ctx(struct xhci_hcd *xhci,
struct xhci_input_control_ctx *xhci_get_input_control_ctx(struct xhci_hcd *xhci, struct xhci_input_control_ctx *xhci_get_input_control_ctx(struct xhci_hcd *xhci,
struct xhci_container_ctx *ctx) struct xhci_container_ctx *ctx)
{ {
BUG_ON(ctx->type != XHCI_CTX_TYPE_INPUT); if (ctx->type != XHCI_CTX_TYPE_INPUT)
return NULL;
return (struct xhci_input_control_ctx *)ctx->bytes; return (struct xhci_input_control_ctx *)ctx->bytes;
} }
......
...@@ -1424,6 +1424,10 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, ...@@ -1424,6 +1424,10 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,
*/ */
ctrl_ctx = xhci_get_input_control_ctx(xhci, ctrl_ctx = xhci_get_input_control_ctx(xhci,
virt_dev->in_ctx); virt_dev->in_ctx);
if (!ctrl_ctx) {
xhci_warn(xhci, "Could not get input context, bad type.\n");
break;
}
/* Input ctx add_flags are the endpoint index plus one */ /* Input ctx add_flags are the endpoint index plus one */
ep_index = xhci_last_valid_endpoint(le32_to_cpu(ctrl_ctx->add_flags)) - 1; ep_index = xhci_last_valid_endpoint(le32_to_cpu(ctrl_ctx->add_flags)) - 1;
/* A usb_set_interface() call directly after clearing a halted /* A usb_set_interface() call directly after clearing a halted
......
This diff is collapsed.
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