staging: octeon-usb: move interrupt transfer handling into separate function
authorAaro Koskinen <aaro.koskinen@iki.fi>
Fri, 26 Feb 2016 00:14:02 +0000 (02:14 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 26 Feb 2016 06:38:16 +0000 (22:38 -0800)
Move bulk transfer handling into a separate function to avoid
deep indentation.

Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/octeon-usb/octeon-hcd.c

index d8c032f1d919ea57e130fbf0d56f4ae0b10dadef..644a7e8654fcb03504cd5150c3bb3c3b63257cc0 100644 (file)
@@ -2501,6 +2501,31 @@ static void cvmx_usb_transfer_bulk(struct octeon_hcd *usb,
        }
 }
 
+static void cvmx_usb_transfer_intr(struct octeon_hcd *usb,
+                                  struct cvmx_usb_pipe *pipe,
+                                  struct cvmx_usb_transaction *transaction,
+                                  int buffer_space_left,
+                                  int bytes_in_last_packet)
+{
+       if (cvmx_usb_pipe_needs_split(usb, pipe)) {
+               if (transaction->stage == CVMX_USB_STAGE_NON_CONTROL) {
+                       transaction->stage =
+                               CVMX_USB_STAGE_NON_CONTROL_SPLIT_COMPLETE;
+               } else if (buffer_space_left &&
+                          (bytes_in_last_packet == pipe->max_packet)) {
+                       transaction->stage = CVMX_USB_STAGE_NON_CONTROL;
+               } else {
+                       pipe->next_tx_frame += pipe->interval;
+                       cvmx_usb_complete(usb, pipe, transaction,
+                                         CVMX_USB_STATUS_OK);
+               }
+       } else if (!buffer_space_left ||
+                  (bytes_in_last_packet < pipe->max_packet)) {
+               pipe->next_tx_frame += pipe->interval;
+               cvmx_usb_complete(usb, pipe, transaction, CVMX_USB_STATUS_OK);
+       }
+}
+
 /**
  * Poll a channel for status
  *
@@ -2785,52 +2810,9 @@ static int cvmx_usb_poll_channel(struct octeon_hcd *usb, int channel)
                                               bytes_in_last_packet);
                        break;
                case CVMX_USB_TRANSFER_INTERRUPT:
-                       /*
-                        * The only time a bulk transfer isn't complete when it
-                        * finishes with an ACK is during a split transaction.
-                        * For splits we need to continue the transfer if more
-                        * data is needed
-                        */
-                       if (cvmx_usb_pipe_needs_split(usb, pipe)) {
-                               if (transaction->stage ==
-                                   CVMX_USB_STAGE_NON_CONTROL) {
-                                       transaction->stage =
-                                               CVMX_USB_STAGE_NON_CONTROL_SPLIT_COMPLETE;
-                               } else if (buffer_space_left &&
-                                          (bytes_in_last_packet ==
-                                          pipe->max_packet)) {
-                                       transaction->stage =
-                                               CVMX_USB_STAGE_NON_CONTROL;
-                               } else {
-                                       if (transaction->type ==
-                                           CVMX_USB_TRANSFER_INTERRUPT)
-                                               pipe->next_tx_frame +=
-                                                       pipe->interval;
-                                       cvmx_usb_complete(usb, pipe,
-                                                         transaction,
-                                                         CVMX_USB_STATUS_OK);
-                               }
-                       } else {
-                               if ((pipe->device_speed ==
-                                    CVMX_USB_SPEED_HIGH) &&
-                                   (pipe->transfer_type ==
-                                    CVMX_USB_TRANSFER_BULK) &&
-                                   (pipe->transfer_dir ==
-                                    CVMX_USB_DIRECTION_OUT) &&
-                                   (usbc_hcint.s.nak))
-                                       pipe->flags |=
-                                               CVMX_USB_PIPE_FLAGS_NEED_PING;
-                               if (!buffer_space_left ||
-                                   (bytes_in_last_packet < pipe->max_packet)) {
-                                       if (transaction->type ==
-                                           CVMX_USB_TRANSFER_INTERRUPT)
-                                               pipe->next_tx_frame +=
-                                                       pipe->interval;
-                                       cvmx_usb_complete(usb, pipe,
-                                                         transaction,
-                                                         CVMX_USB_STATUS_OK);
-                               }
-                       }
+                       cvmx_usb_transfer_intr(usb, pipe, transaction,
+                                              buffer_space_left,
+                                              bytes_in_last_packet);
                        break;
                case CVMX_USB_TRANSFER_ISOCHRONOUS:
                        if (cvmx_usb_pipe_needs_split(usb, pipe)) {