staging: octeon-usb: fail and warn if DMA counters are wrong
authorAaro Koskinen <aaro.koskinen@iki.fi>
Sun, 22 Mar 2015 15:38:00 +0000 (17:38 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 24 Mar 2015 12:47:13 +0000 (13:47 +0100)
Fail and WARN if DMA counters are wrong.

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 84640454ba71e606123d661ad2f54df50e4d24e4..27acab217d2100d25c4176b4dd7a7a1bff916854 100644 (file)
@@ -2617,6 +2617,17 @@ static int cvmx_usb_poll_channel(struct cvmx_usb_state *usb, int channel)
                (pipe->transfer_dir == CVMX_USB_DIRECTION_OUT))
                pipe->flags |= CVMX_USB_PIPE_FLAGS_NEED_PING;
 
+       if (unlikely(WARN_ON_ONCE(bytes_this_transfer < 0))) {
+               /*
+                * In some rare cases the DMA engine seems to get stuck and
+                * keeps substracting same byte count over and over again. In
+                * such case we just need to fail every transaction.
+                */
+               cvmx_usb_perform_complete(usb, pipe, transaction,
+                                         CVMX_USB_COMPLETE_ERROR);
+               return 0;
+       }
+
        if (usbc_hcint.s.stall) {
                /*
                 * STALL as a response means this transaction cannot be