qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/3] ohci reset improvements
@ 2015-12-19 23:23 Hervé Poussineau
  2015-12-19 23:23 ` [Qemu-devel] [PATCH 1/3] ohci: split reset method in 3 parts Hervé Poussineau
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Hervé Poussineau @ 2015-12-19 23:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, Gerd Hoffmann, Hervé Poussineau

Hi,

This small patchset adds different reset levels to OHCI USB controller.
The idea is from Benjamin Herrenschmidt.
Most significant change is that MacOS 9 doesn't try anymore to do some
DMA transfer to address 0, and boots a little bit further.

Hervé

Hervé Poussineau (3):
  ohci: split reset method in 3 parts
  ohci: fix Host Controller USBRESET
  ohci: fix command HostControllerReset

 hw/usb/hcd-ohci.c | 64 ++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 37 insertions(+), 27 deletions(-)

-- 
2.1.4

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 1/3] ohci: split reset method in 3 parts
  2015-12-19 23:23 [Qemu-devel] [PATCH 0/3] ohci reset improvements Hervé Poussineau
@ 2015-12-19 23:23 ` Hervé Poussineau
  2015-12-19 23:23 ` [Qemu-devel] [PATCH 2/3] ohci: fix Host Controller USBRESET Hervé Poussineau
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Hervé Poussineau @ 2015-12-19 23:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, Gerd Hoffmann, Hervé Poussineau

The three parts are:
- root hub reset (ohci_roothub_reset)
- host controller soft reset (ohci_soft_reset)
- host controller hard reset (ohci_hard_reset)

Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
 hw/usb/hcd-ohci.c | 64 ++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 37 insertions(+), 27 deletions(-)

diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 7d65818..0661804 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -439,15 +439,37 @@ static void ohci_stop_endpoints(OHCIState *ohci)
     }
 }
 
-/* Reset the controller */
-static void ohci_reset(void *opaque)
+static void ohci_roothub_reset(OHCIState *ohci)
 {
-    OHCIState *ohci = opaque;
     OHCIPort *port;
     int i;
 
     ohci_bus_stop(ohci);
-    ohci->ctl = 0;
+    ohci->rhdesc_a = OHCI_RHA_NPS | ohci->num_ports;
+    ohci->rhdesc_b = 0x0; /* Impl. specific */
+    ohci->rhstatus = 0;
+
+    for (i = 0; i < ohci->num_ports; i++) {
+        port = &ohci->rhport[i];
+        port->ctrl = 0;
+        if (port->port.dev && port->port.dev->attached) {
+            usb_port_reset(&port->port);
+        }
+    }
+    if (ohci->async_td) {
+        usb_cancel_packet(&ohci->usb_packet);
+        ohci->async_td = 0;
+    }
+    ohci_stop_endpoints(ohci);
+}
+
+/* Reset the controller */
+static void ohci_soft_reset(OHCIState *ohci)
+{
+    trace_usb_ohci_reset(ohci->name);
+
+    ohci_bus_stop(ohci);
+    ohci->ctl = (ohci->ctl & OHCI_CTL_IR) | OHCI_USB_SUSPEND;
     ohci->old_ctl = 0;
     ohci->status = 0;
     ohci->intr_status = 0;
@@ -470,25 +492,13 @@ static void ohci_reset(void *opaque)
     ohci->frame_number = 0;
     ohci->pstart = 0;
     ohci->lst = OHCI_LS_THRESH;
+}
 
-    ohci->rhdesc_a = OHCI_RHA_NPS | ohci->num_ports;
-    ohci->rhdesc_b = 0x0; /* Impl. specific */
-    ohci->rhstatus = 0;
-
-    for (i = 0; i < ohci->num_ports; i++)
-      {
-        port = &ohci->rhport[i];
-        port->ctrl = 0;
-        if (port->port.dev && port->port.dev->attached) {
-            usb_port_reset(&port->port);
-        }
-      }
-    if (ohci->async_td) {
-        usb_cancel_packet(&ohci->usb_packet);
-        ohci->async_td = 0;
-    }
-    ohci_stop_endpoints(ohci);
-    trace_usb_ohci_reset(ohci->name);
+static void ohci_hard_reset(OHCIState *ohci)
+{
+    ohci_soft_reset(ohci);
+    ohci->ctl = 0;
+    ohci_roothub_reset(ohci);
 }
 
 /* Get an array of dwords from main memory */
@@ -1441,7 +1451,7 @@ static void ohci_set_ctl(OHCIState *ohci, uint32_t val)
         trace_usb_ohci_resume(ohci->name);
         break;
     case OHCI_USB_RESET:
-        ohci_reset(ohci);
+        ohci_hard_reset(ohci);
         break;
     }
 }
@@ -1704,7 +1714,7 @@ static void ohci_mem_write(void *opaque,
         ohci->status |= val;
 
         if (ohci->status & OHCI_STATUS_HCR)
-            ohci_reset(ohci);
+            ohci_hard_reset(ohci);
         break;
 
     case 3: /* HcInterruptStatus */
@@ -1783,7 +1793,7 @@ static void ohci_mem_write(void *opaque,
     case 25: /* HcHReset */
         ohci->hreset = val & ~OHCI_HRESET_FSBIR;
         if (val & OHCI_HRESET_FSBIR)
-            ohci_reset(ohci);
+            ohci_hard_reset(ohci);
         break;
 
     case 26: /* HcHInterruptEnable */
@@ -1960,7 +1970,7 @@ static void usb_ohci_reset_pci(DeviceState *d)
     OHCIPCIState *ohci = PCI_OHCI(dev);
     OHCIState *s = &ohci->state;
 
-    ohci_reset(s);
+    ohci_hard_reset(s);
 }
 
 #define TYPE_SYSBUS_OHCI "sysbus-ohci"
@@ -1993,7 +2003,7 @@ static void usb_ohci_reset_sysbus(DeviceState *dev)
     OHCISysBusState *s = SYSBUS_OHCI(dev);
     OHCIState *ohci = &s->ohci;
 
-    ohci_reset(ohci);
+    ohci_hard_reset(ohci);
 }
 
 static Property ohci_pci_properties[] = {
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 2/3] ohci: fix Host Controller USBRESET
  2015-12-19 23:23 [Qemu-devel] [PATCH 0/3] ohci reset improvements Hervé Poussineau
  2015-12-19 23:23 ` [Qemu-devel] [PATCH 1/3] ohci: split reset method in 3 parts Hervé Poussineau
@ 2015-12-19 23:23 ` Hervé Poussineau
  2015-12-19 23:23 ` [Qemu-devel] [PATCH 3/3] ohci: fix command HostControllerReset Hervé Poussineau
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Hervé Poussineau @ 2015-12-19 23:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, Gerd Hoffmann, Hervé Poussineau

Specification says that, when entering this state, "the contents of the registers
(except Root Hub registers) are preserved by the HC. [...] The Root Hub is being reset,
which causes the Root Hub's downstream ports to be reset and possibly powered off."

Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
 hw/usb/hcd-ohci.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 0661804..24c62b4 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -1451,7 +1451,7 @@ static void ohci_set_ctl(OHCIState *ohci, uint32_t val)
         trace_usb_ohci_resume(ohci->name);
         break;
     case OHCI_USB_RESET:
-        ohci_hard_reset(ohci);
+        ohci_roothub_reset(ohci);
         break;
     }
 }
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [Qemu-devel] [PATCH 3/3] ohci: fix command HostControllerReset
  2015-12-19 23:23 [Qemu-devel] [PATCH 0/3] ohci reset improvements Hervé Poussineau
  2015-12-19 23:23 ` [Qemu-devel] [PATCH 1/3] ohci: split reset method in 3 parts Hervé Poussineau
  2015-12-19 23:23 ` [Qemu-devel] [PATCH 2/3] ohci: fix Host Controller USBRESET Hervé Poussineau
@ 2015-12-19 23:23 ` Hervé Poussineau
  2015-12-20 18:34 ` [Qemu-devel] [Qemu-ppc] [PATCH 0/3] ohci reset improvements Mark Cave-Ayland
  2016-01-04 11:35 ` [Qemu-devel] " Gerd Hoffmann
  4 siblings, 0 replies; 6+ messages in thread
From: Hervé Poussineau @ 2015-12-19 23:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-ppc, Gerd Hoffmann, Hervé Poussineau

Specification says that: "This bit is set by HCD to initiate a software reset of HC."

Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
 hw/usb/hcd-ohci.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c
index 24c62b4..d225ebb 100644
--- a/hw/usb/hcd-ohci.c
+++ b/hw/usb/hcd-ohci.c
@@ -1714,7 +1714,7 @@ static void ohci_mem_write(void *opaque,
         ohci->status |= val;
 
         if (ohci->status & OHCI_STATUS_HCR)
-            ohci_hard_reset(ohci);
+            ohci_soft_reset(ohci);
         break;
 
     case 3: /* HcInterruptStatus */
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [Qemu-ppc] [PATCH 0/3] ohci reset improvements
  2015-12-19 23:23 [Qemu-devel] [PATCH 0/3] ohci reset improvements Hervé Poussineau
                   ` (2 preceding siblings ...)
  2015-12-19 23:23 ` [Qemu-devel] [PATCH 3/3] ohci: fix command HostControllerReset Hervé Poussineau
@ 2015-12-20 18:34 ` Mark Cave-Ayland
  2016-01-04 11:35 ` [Qemu-devel] " Gerd Hoffmann
  4 siblings, 0 replies; 6+ messages in thread
From: Mark Cave-Ayland @ 2015-12-20 18:34 UTC (permalink / raw)
  To: Hervé Poussineau, qemu-devel; +Cc: qemu-ppc, Gerd Hoffmann

On 19/12/15 23:23, Hervé Poussineau wrote:

> Hi,
> 
> This small patchset adds different reset levels to OHCI USB controller.
> The idea is from Benjamin Herrenschmidt.
> Most significant change is that MacOS 9 doesn't try anymore to do some
> DMA transfer to address 0, and boots a little bit further.
> 
> Hervé
> 
> Hervé Poussineau (3):
>   ohci: split reset method in 3 parts
>   ohci: fix Host Controller USBRESET
>   ohci: fix command HostControllerReset
> 
>  hw/usb/hcd-ohci.c | 64 ++++++++++++++++++++++++++++++++-----------------------
>  1 file changed, 37 insertions(+), 27 deletions(-)

I've given this patchset a test against my GSOC OS 9 images and it seems
to help against USB crashes (although there are still other extensions
that crash on boot) while not regressing my other images, so:

Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>


ATB,

Mark.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH 0/3] ohci reset improvements
  2015-12-19 23:23 [Qemu-devel] [PATCH 0/3] ohci reset improvements Hervé Poussineau
                   ` (3 preceding siblings ...)
  2015-12-20 18:34 ` [Qemu-devel] [Qemu-ppc] [PATCH 0/3] ohci reset improvements Mark Cave-Ayland
@ 2016-01-04 11:35 ` Gerd Hoffmann
  4 siblings, 0 replies; 6+ messages in thread
From: Gerd Hoffmann @ 2016-01-04 11:35 UTC (permalink / raw)
  To: Hervé Poussineau; +Cc: qemu-ppc, qemu-devel

On So, 2015-12-20 at 00:23 +0100, Hervé Poussineau wrote:
> Hi,
> 
> This small patchset adds different reset levels to OHCI USB controller.
> The idea is from Benjamin Herrenschmidt.
> Most significant change is that MacOS 9 doesn't try anymore to do some
> DMA transfer to address 0, and boots a little bit further.
> 
> Hervé
> 
> Hervé Poussineau (3):
>   ohci: split reset method in 3 parts
>   ohci: fix Host Controller USBRESET
>   ohci: fix command HostControllerReset
> 
>  hw/usb/hcd-ohci.c | 64 ++++++++++++++++++++++++++++++++-----------------------
>  1 file changed, 37 insertions(+), 27 deletions(-)

Added to usb patch queue.

thanks,
  Gerd

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-01-04 11:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-19 23:23 [Qemu-devel] [PATCH 0/3] ohci reset improvements Hervé Poussineau
2015-12-19 23:23 ` [Qemu-devel] [PATCH 1/3] ohci: split reset method in 3 parts Hervé Poussineau
2015-12-19 23:23 ` [Qemu-devel] [PATCH 2/3] ohci: fix Host Controller USBRESET Hervé Poussineau
2015-12-19 23:23 ` [Qemu-devel] [PATCH 3/3] ohci: fix command HostControllerReset Hervé Poussineau
2015-12-20 18:34 ` [Qemu-devel] [Qemu-ppc] [PATCH 0/3] ohci reset improvements Mark Cave-Ayland
2016-01-04 11:35 ` [Qemu-devel] " Gerd Hoffmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).