dcavalca / rpms / qemu

Forked from rpms/qemu 11 months ago
Clone

Blame 0138-usb-add-USB_RET_IOERROR.patch

Hans de Goede 1b1995
From 2a6bbdddc2aca6af038c42054c3d3a7b09e5ac3a Mon Sep 17 00:00:00 2001
Hans de Goede 1b1995
From: Hans de Goede <hdegoede@redhat.com>
Hans de Goede 1b1995
Date: Fri, 2 Mar 2012 00:26:23 +0100
Hans de Goede 1b1995
Subject: [PATCH 138/140] usb: add USB_RET_IOERROR
Hans de Goede 1b1995
Hans de Goede 1b1995
We already have USB_RET_NAK, but that means that a device does not want
Hans de Goede 1b1995
to send/receive right now. But with host / network redirection we can
Hans de Goede 1b1995
actually have a transaction fail due to some io error, rather then ie
Hans de Goede 1b1995
the device just not having any data atm.
Hans de Goede 1b1995
Hans de Goede 1b1995
This patch adds a new error code named USB_RET_IOERROR for this, and uses
Hans de Goede 1b1995
it were appropriate.
Hans de Goede 1b1995
Hans de Goede 1b1995
Notes:
Hans de Goede 1b1995
-Currently all usb-controllers handle this the same as NODEV, but that
Hans de Goede 1b1995
 may change in the future, OHCI could indicate a CRC error instead for example.
Hans de Goede 1b1995
-This patch does not touch hw/usb-musb.c, that is because the code in there
Hans de Goede 1b1995
 handles STALL and NAK specially and has a if status < 0 generic catch all
Hans de Goede 1b1995
 for all other errors
Hans de Goede 1b1995
Hans de Goede 1b1995
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Hans de Goede 1b1995
---
Hans de Goede 1b1995
 hw/usb-ehci.c |    2 ++
Hans de Goede 1b1995
 hw/usb-ohci.c |    2 ++
Hans de Goede 1b1995
 hw/usb-uhci.c |    1 +
Hans de Goede 1b1995
 hw/usb.h      |   11 ++++++-----
Hans de Goede 1b1995
 usb-linux.c   |    4 ++--
Hans de Goede 1b1995
 usb-redir.c   |    9 ++++++---
Hans de Goede 1b1995
 6 files changed, 19 insertions(+), 10 deletions(-)
Hans de Goede 1b1995
Hans de Goede 1b1995
diff --git a/hw/usb-ehci.c b/hw/usb-ehci.c
Hans de Goede 1b1995
index 72c3f2a..ba1b9da 100644
Hans de Goede 1b1995
--- a/hw/usb-ehci.c
Hans de Goede 1b1995
+++ b/hw/usb-ehci.c
Hans de Goede 1b1995
@@ -1275,6 +1275,7 @@ static void ehci_execute_complete(EHCIQueue *q)
Hans de Goede 1b1995
 
Hans de Goede 1b1995
     if (q->usb_status < 0) {
Hans de Goede 1b1995
         switch(q->usb_status) {
Hans de Goede 1b1995
+        case USB_RET_IOERROR:
Hans de Goede 1b1995
         case USB_RET_NODEV:
Hans de Goede 1b1995
             q->qh.token |= (QTD_TOKEN_HALT | QTD_TOKEN_XACTERR);
Hans de Goede 1b1995
             set_field(&q->qh.token, 0, QTD_TOKEN_CERR);
Hans de Goede 1b1995
@@ -1471,6 +1472,7 @@ static int ehci_process_itd(EHCIState *ehci,
Hans de Goede 1b1995
                 default:
Hans de Goede 1b1995
                     fprintf(stderr, "Unexpected iso usb result: %d\n", ret);
Hans de Goede 1b1995
                     /* Fall through */
Hans de Goede 1b1995
+                case USB_RET_IOERROR:
Hans de Goede 1b1995
                 case USB_RET_NODEV:
Hans de Goede 1b1995
                     /* 3.3.2: XACTERR is only allowed on IN transactions */
Hans de Goede 1b1995
                     if (dir) {
Hans de Goede 1b1995
diff --git a/hw/usb-ohci.c b/hw/usb-ohci.c
Hans de Goede 1b1995
index c2981c5..d805497 100644
Hans de Goede 1b1995
--- a/hw/usb-ohci.c
Hans de Goede 1b1995
+++ b/hw/usb-ohci.c
Hans de Goede 1b1995
@@ -828,6 +828,7 @@ static int ohci_service_iso_td(OHCIState *ohci, struct ohci_ed *ed,
Hans de Goede 1b1995
                         OHCI_CC_DATAUNDERRUN);
Hans de Goede 1b1995
         } else {
Hans de Goede 1b1995
             switch (ret) {
Hans de Goede 1b1995
+            case USB_RET_IOERROR:
Hans de Goede 1b1995
             case USB_RET_NODEV:
Hans de Goede 1b1995
                 OHCI_SET_BM(iso_td.offset[relative_frame_number], TD_PSW_CC,
Hans de Goede 1b1995
                             OHCI_CC_DEVICENOTRESPONDING);
Hans de Goede 1b1995
@@ -1051,6 +1052,7 @@ static int ohci_service_td(OHCIState *ohci, struct ohci_ed *ed)
Hans de Goede 1b1995
             OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_DATAUNDERRUN);
Hans de Goede 1b1995
         } else {
Hans de Goede 1b1995
             switch (ret) {
Hans de Goede 1b1995
+            case USB_RET_IOERROR:
Hans de Goede 1b1995
             case USB_RET_NODEV:
Hans de Goede 1b1995
                 OHCI_SET_BM(td.flags, TD_CC, OHCI_CC_DEVICENOTRESPONDING);
Hans de Goede 1b1995
             case USB_RET_NAK:
Hans de Goede 1b1995
diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
Hans de Goede 1b1995
index f9e3ea5..a994943 100644
Hans de Goede 1b1995
--- a/hw/usb-uhci.c
Hans de Goede 1b1995
+++ b/hw/usb-uhci.c
Hans de Goede 1b1995
@@ -751,6 +751,7 @@ out:
Hans de Goede 1b1995
             break;
Hans de Goede 1b1995
 	return 1;
Hans de Goede 1b1995
 
Hans de Goede 1b1995
+    case USB_RET_IOERROR:
Hans de Goede 1b1995
     case USB_RET_NODEV:
Hans de Goede 1b1995
     default:
Hans de Goede 1b1995
 	break;
Hans de Goede 1b1995
diff --git a/hw/usb.h b/hw/usb.h
Hans de Goede 1b1995
index c6e1870..4010e12 100644
Hans de Goede 1b1995
--- a/hw/usb.h
Hans de Goede 1b1995
+++ b/hw/usb.h
Hans de Goede 1b1995
@@ -41,11 +41,12 @@
Hans de Goede 1b1995
 #define USB_MSG_DETACH   0x101
Hans de Goede 1b1995
 #define USB_MSG_RESET    0x102
Hans de Goede 1b1995
 
Hans de Goede 1b1995
-#define USB_RET_NODEV  (-1)
Hans de Goede 1b1995
-#define USB_RET_NAK    (-2)
Hans de Goede 1b1995
-#define USB_RET_STALL  (-3)
Hans de Goede 1b1995
-#define USB_RET_BABBLE (-4)
Hans de Goede 1b1995
-#define USB_RET_ASYNC  (-5)
Hans de Goede 1b1995
+#define USB_RET_NODEV   (-1)
Hans de Goede 1b1995
+#define USB_RET_NAK     (-2)
Hans de Goede 1b1995
+#define USB_RET_STALL   (-3)
Hans de Goede 1b1995
+#define USB_RET_BABBLE  (-4)
Hans de Goede 1b1995
+#define USB_RET_IOERROR (-5)
Hans de Goede 1b1995
+#define USB_RET_ASYNC   (-6)
Hans de Goede 1b1995
 
Hans de Goede 1b1995
 #define USB_SPEED_LOW   0
Hans de Goede 1b1995
 #define USB_SPEED_FULL  1
Hans de Goede 1b1995
diff --git a/usb-linux.c b/usb-linux.c
Hans de Goede 1b1995
index b2d70f9..9f13d1e 100644
Hans de Goede 1b1995
--- a/usb-linux.c
Hans de Goede 1b1995
+++ b/usb-linux.c
Hans de Goede 1b1995
@@ -395,7 +395,7 @@ static void async_complete(void *opaque)
Hans de Goede 1b1995
                 break;
Hans de Goede 1b1995
 
Hans de Goede 1b1995
             default:
Hans de Goede 1b1995
-                p->result = USB_RET_NAK;
Hans de Goede 1b1995
+                p->result = USB_RET_IOERROR;
Hans de Goede 1b1995
                 break;
Hans de Goede 1b1995
             }
Hans de Goede 1b1995
 
Hans de Goede 1b1995
@@ -725,7 +725,7 @@ static int urb_status_to_usb_ret(int status)
Hans de Goede 1b1995
     case -EOVERFLOW:
Hans de Goede 1b1995
         return USB_RET_BABBLE;
Hans de Goede 1b1995
     default:
Hans de Goede 1b1995
-        return USB_RET_NAK;
Hans de Goede 1b1995
+        return USB_RET_IOERROR;
Hans de Goede 1b1995
     }
Hans de Goede 1b1995
 }
Hans de Goede 1b1995
 
Hans de Goede 1b1995
diff --git a/usb-redir.c b/usb-redir.c
Hans de Goede 1b1995
index 61860ef..f64443e 100644
Hans de Goede 1b1995
--- a/usb-redir.c
Hans de Goede 1b1995
+++ b/usb-redir.c
Hans de Goede 1b1995
@@ -441,7 +441,7 @@ static int usbredir_handle_iso_data(USBRedirDevice *dev, USBPacket *p,
Hans de Goede 1b1995
             /* Check iso_error for stream errors, otherwise its an underrun */
Hans de Goede 1b1995
             status = dev->endpoint[EP2I(ep)].iso_error;
Hans de Goede 1b1995
             dev->endpoint[EP2I(ep)].iso_error = 0;
Hans de Goede 1b1995
-            return status ? USB_RET_NAK : 0;
Hans de Goede 1b1995
+            return status ? USB_RET_IOERROR : 0;
Hans de Goede 1b1995
         }
Hans de Goede 1b1995
         DPRINTF2("iso-token-in ep %02X status %d len %d queue-size: %d\n", ep,
Hans de Goede 1b1995
                  isop->status, isop->len, dev->endpoint[EP2I(ep)].bufpq_size);
Hans de Goede 1b1995
@@ -449,7 +449,7 @@ static int usbredir_handle_iso_data(USBRedirDevice *dev, USBPacket *p,
Hans de Goede 1b1995
         status = isop->status;
Hans de Goede 1b1995
         if (status != usb_redir_success) {
Hans de Goede 1b1995
             bufp_free(dev, isop, ep);
Hans de Goede 1b1995
-            return USB_RET_NAK;
Hans de Goede 1b1995
+            return USB_RET_IOERROR;
Hans de Goede 1b1995
         }
Hans de Goede 1b1995
 
Hans de Goede 1b1995
         len = isop->len;
Hans de Goede 1b1995
@@ -1045,11 +1045,14 @@ static int usbredir_handle_status(USBRedirDevice *dev,
Hans de Goede 1b1995
         return USB_RET_STALL;
Hans de Goede 1b1995
     case usb_redir_cancelled:
Hans de Goede 1b1995
         WARNING("returning cancelled packet to HC?\n");
Hans de Goede 1b1995
+        return USB_RET_NAK;
Hans de Goede 1b1995
     case usb_redir_inval:
Hans de Goede 1b1995
+        WARNING("got invalid param error from usb-host?\n");
Hans de Goede 1b1995
+        return USB_RET_NAK;
Hans de Goede 1b1995
     case usb_redir_ioerror:
Hans de Goede 1b1995
     case usb_redir_timeout:
Hans de Goede 1b1995
     default:
Hans de Goede 1b1995
-        return USB_RET_NAK;
Hans de Goede 1b1995
+        return USB_RET_IOERROR;
Hans de Goede 1b1995
     }
Hans de Goede 1b1995
 }
Hans de Goede 1b1995
 
Hans de Goede 1b1995
-- 
Hans de Goede 1b1995
1.7.9.3
Hans de Goede 1b1995