From: Aaro Koskinen Date: Thu, 10 Oct 2013 20:25:32 +0000 (+0300) Subject: staging: octeon-usb: use dynamic allocation for pipes X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=d2695a8a3de7247a4a034a6bb1ad332261db47d7;p=GitHub%2Fmoto-9609%2Fandroid_kernel_motorola_exynos9610.git staging: octeon-usb: use dynamic allocation for pipes Use dynamic memory allocation for pipes. Signed-off-by: Aaro Koskinen Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/octeon-usb/octeon-hcd.c b/drivers/staging/octeon-usb/octeon-hcd.c index 65b3d4cb61ad..6e72bf0e22e5 100644 --- a/drivers/staging/octeon-usb/octeon-hcd.c +++ b/drivers/staging/octeon-usb/octeon-hcd.c @@ -234,8 +234,6 @@ enum cvmx_usb_initialize_flags { /** * enum cvmx_usb_pipe_flags - internal flags for a pipe. * - * @__CVMX_USB_PIPE_FLAGS_OPEN: Used internally to determine if a pipe is - * open. Do not use. * @__CVMX_USB_PIPE_FLAGS_SCHEDULED: Used internally to determine if a pipe is * actively using hardware. Do not use. * @__CVMX_USB_PIPE_FLAGS_NEED_PING: Used internally to determine if a high @@ -243,7 +241,6 @@ enum cvmx_usb_initialize_flags { * use. */ enum cvmx_usb_pipe_flags { - __CVMX_USB_PIPE_FLAGS_OPEN = 1 << 16, __CVMX_USB_PIPE_FLAGS_SCHEDULED = 1 << 17, __CVMX_USB_PIPE_FLAGS_NEED_PING = 1 << 18, }; @@ -254,9 +251,6 @@ enum cvmx_usb_pipe_flags { /* Maximum number of times to retry failed transactions */ #define MAX_RETRIES 3 -/* Maximum number of pipes that can be open at once */ -#define MAX_PIPES 32 - /* Maximum number of hardware channels supported by the USB block */ #define MAX_CHANNELS 8 @@ -429,7 +423,6 @@ struct cvmx_usb_tx_fifo { * pipe: Storage for pipes. * indent: Used by debug output to indent functions. * port_status: Last port status used for change notification. - * free_pipes: List of all pipes that are currently closed. * idle_pipes: List of open pipes that have no transactions. * active_pipes: Active pipes indexed by transfer type. * frame_number: Increments every SOF interrupt for time keeping. @@ -441,10 +434,8 @@ struct cvmx_usb_state { int idle_hardware_channels; union cvmx_usbcx_hprt usbcx_hprt; struct cvmx_usb_pipe *pipe_for_channel[MAX_CHANNELS]; - struct cvmx_usb_pipe pipe[MAX_PIPES]; int indent; struct cvmx_usb_port_status port_status; - struct cvmx_usb_pipe_list free_pipes; struct cvmx_usb_pipe_list idle_pipes; struct cvmx_usb_pipe_list active_pipes[4]; uint64_t frame_number; @@ -736,13 +727,7 @@ static int cvmx_usb_initialize(struct cvmx_usb_state *usb, usb->init_flags = flags; /* Initialize the USB state structure */ - { - int i; - usb->index = usb_port_number; - - for (i = 0; i < MAX_PIPES; i++) - __cvmx_usb_append_pipe(&usb->free_pipes, usb->pipe + i); - } + usb->index = usb_port_number; /* * Power On Reset and PHY Initialization @@ -1273,12 +1258,9 @@ static struct cvmx_usb_pipe *cvmx_usb_open_pipe(struct cvmx_usb_state *usb, if (unlikely((hub_port < 0) || (hub_port > MAX_USB_HUB_PORT))) return NULL; - /* Find a free pipe */ - pipe = usb->free_pipes.head; + pipe = kzalloc(sizeof(*pipe), GFP_ATOMIC); if (!pipe) return NULL; - __cvmx_usb_remove_pipe(&usb->free_pipes, pipe); - pipe->flags = __CVMX_USB_PIPE_FLAGS_OPEN; if ((device_speed == CVMX_USB_SPEED_HIGH) && (transfer_dir == CVMX_USB_DIRECTION_OUT) && (transfer_type == CVMX_USB_TRANSFER_BULK)) @@ -2237,9 +2219,6 @@ static struct cvmx_usb_transaction *__cvmx_usb_submit_transaction(struct cvmx_us { struct cvmx_usb_transaction *transaction; - /* Fail if the pipe isn't open */ - if (unlikely((pipe->flags & __CVMX_USB_PIPE_FLAGS_OPEN) == 0)) - return NULL; if (unlikely(pipe->transfer_type != type)) return NULL; @@ -2409,10 +2388,6 @@ static int cvmx_usb_cancel(struct cvmx_usb_state *usb, struct cvmx_usb_pipe *pipe, struct cvmx_usb_transaction *transaction) { - /* Fail if the pipe isn't open */ - if (unlikely((pipe->flags & __CVMX_USB_PIPE_FLAGS_OPEN) == 0)) - return -EINVAL; - /* * If the transaction is the HEAD of the queue and scheduled. We need to * treat it special @@ -2453,10 +2428,6 @@ static int cvmx_usb_cancel(struct cvmx_usb_state *usb, static int cvmx_usb_cancel_all(struct cvmx_usb_state *usb, struct cvmx_usb_pipe *pipe) { - /* Fail if the pipe isn't open */ - if (unlikely((pipe->flags & __CVMX_USB_PIPE_FLAGS_OPEN) == 0)) - return -EINVAL; - /* Simply loop through and attempt to cancel each transaction */ while (pipe->head) { int result = cvmx_usb_cancel(usb, pipe, pipe->head); @@ -2479,17 +2450,12 @@ static int cvmx_usb_cancel_all(struct cvmx_usb_state *usb, static int cvmx_usb_close_pipe(struct cvmx_usb_state *usb, struct cvmx_usb_pipe *pipe) { - /* Fail if the pipe isn't open */ - if (unlikely((pipe->flags & __CVMX_USB_PIPE_FLAGS_OPEN) == 0)) - return -EINVAL; - /* Fail if the pipe has pending transactions */ if (unlikely(pipe->head)) return -EBUSY; - pipe->flags = 0; __cvmx_usb_remove_pipe(&usb->idle_pipes, pipe); - __cvmx_usb_append_pipe(&usb->free_pipes, pipe); + kfree(pipe); return 0; }