diff options
author | Sarah Sharp <sarah.a.sharp@linux.intel.com> | 2009-12-09 18:59:03 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-03-02 17:53:09 -0500 |
commit | a1d78c16bd31a715785e21967ac6110b386a3c1f (patch) | |
tree | b0df8ca079b2afad844276fdf2ece21dbcdc38fa /drivers/usb/host/xhci-mem.c | |
parent | 412566bd716397e28e81fc9b20804bc6a6daf14d (diff) |
USB: xhci: Allow allocation of commands without input contexts.
The xhci_command structure is the basic structure for issuing commands to
the xHCI hardware. It contains a struct completion (so that the issuing
function can wait on the command), command status, and a input context
that is used to pass information to the hardware. Not all commands need
the input context, so make it optional to allocate. Allow
xhci_free_container_ctx() to be passed a NULL input context, to make
freeing the xhci_command structure simple.
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/xhci-mem.c')
-rw-r--r-- | drivers/usb/host/xhci-mem.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 1f1f8a0f2e66..8045bc69083d 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
@@ -267,6 +267,8 @@ struct xhci_container_ctx *xhci_alloc_container_ctx(struct xhci_hcd *xhci, | |||
267 | void xhci_free_container_ctx(struct xhci_hcd *xhci, | 267 | void xhci_free_container_ctx(struct xhci_hcd *xhci, |
268 | struct xhci_container_ctx *ctx) | 268 | struct xhci_container_ctx *ctx) |
269 | { | 269 | { |
270 | if (!ctx) | ||
271 | return; | ||
270 | dma_pool_free(xhci->device_pool, ctx->bytes, ctx->dma); | 272 | dma_pool_free(xhci->device_pool, ctx->bytes, ctx->dma); |
271 | kfree(ctx); | 273 | kfree(ctx); |
272 | } | 274 | } |
@@ -844,7 +846,8 @@ static void scratchpad_free(struct xhci_hcd *xhci) | |||
844 | } | 846 | } |
845 | 847 | ||
846 | struct xhci_command *xhci_alloc_command(struct xhci_hcd *xhci, | 848 | struct xhci_command *xhci_alloc_command(struct xhci_hcd *xhci, |
847 | bool allocate_completion, gfp_t mem_flags) | 849 | bool allocate_in_ctx, bool allocate_completion, |
850 | gfp_t mem_flags) | ||
848 | { | 851 | { |
849 | struct xhci_command *command; | 852 | struct xhci_command *command; |
850 | 853 | ||
@@ -852,11 +855,14 @@ struct xhci_command *xhci_alloc_command(struct xhci_hcd *xhci, | |||
852 | if (!command) | 855 | if (!command) |
853 | return NULL; | 856 | return NULL; |
854 | 857 | ||
855 | command->in_ctx = | 858 | if (allocate_in_ctx) { |
856 | xhci_alloc_container_ctx(xhci, XHCI_CTX_TYPE_INPUT, mem_flags); | 859 | command->in_ctx = |
857 | if (!command->in_ctx) { | 860 | xhci_alloc_container_ctx(xhci, XHCI_CTX_TYPE_INPUT, |
858 | kfree(command); | 861 | mem_flags); |
859 | return NULL; | 862 | if (!command->in_ctx) { |
863 | kfree(command); | ||
864 | return NULL; | ||
865 | } | ||
860 | } | 866 | } |
861 | 867 | ||
862 | if (allocate_completion) { | 868 | if (allocate_completion) { |