Add auto-hub and leave it off. hw_compat_11_1 turns it on for pci-ohci and sysbus-ohci, so an older machine type keeps the hub it has today and a guest saved by an older QEMU still loads.
pc87560-ohci is its own PCI front end, not a pci-ohci, so it defines the property itself. A companion OHCI adds its ports to the EHCI bus instead of making one, so there the EHCI property decides. Suggested-by: Gerd Hoffmann <[email protected]> Signed-off-by: Jamin Lin <[email protected]> --- hw/usb/hcd-ohci.h | 1 + hw/core/machine.c | 2 ++ hw/usb/hcd-ohci-pci.c | 1 + hw/usb/hcd-ohci-sysbus.c | 1 + hw/usb/hcd-ohci.c | 1 + hw/usb/pc87560-ohci.c | 1 + 6 files changed, 7 insertions(+) diff --git a/hw/usb/hcd-ohci.h b/hw/usb/hcd-ohci.h index d079f8d24e..43240622ef 100644 --- a/hw/usb/hcd-ohci.h +++ b/hw/usb/hcd-ohci.h @@ -98,6 +98,7 @@ struct OHCIState { bool big_endian; bool consistency_check; + bool auto_hub; }; #define TYPE_SYSBUS_OHCI "sysbus-ohci" diff --git a/hw/core/machine.c b/hw/core/machine.c index f79337e7d7..22d2b83459 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -47,6 +47,8 @@ GlobalProperty hw_compat_11_1[] = { { "pci-ehci-usb", "auto-hub", "on" }, { "base-xhci", "auto-hub", "on" }, { "pci-uhci-usb", "auto-hub", "on" }, + { "sysbus-ohci", "auto-hub", "on" }, + { "pci-ohci", "auto-hub", "on" }, }; const size_t hw_compat_11_1_len = G_N_ELEMENTS(hw_compat_11_1); diff --git a/hw/usb/hcd-ohci-pci.c b/hw/usb/hcd-ohci-pci.c index 70c9e9ac4f..11c754a948 100644 --- a/hw/usb/hcd-ohci-pci.c +++ b/hw/usb/hcd-ohci-pci.c @@ -112,6 +112,7 @@ static const Property ohci_pci_properties[] = { DEFINE_PROP_STRING("masterbus", OHCIPCIState, masterbus), DEFINE_PROP_UINT32("num-ports", OHCIPCIState, num_ports, 3), DEFINE_PROP_UINT32("firstport", OHCIPCIState, firstport, 0), + DEFINE_PROP_BOOL("auto-hub", OHCIPCIState, state.auto_hub, false), }; static const VMStateDescription vmstate_ohci = { diff --git a/hw/usb/hcd-ohci-sysbus.c b/hw/usb/hcd-ohci-sysbus.c index 4f51eebccb..69f38b9fce 100644 --- a/hw/usb/hcd-ohci-sysbus.c +++ b/hw/usb/hcd-ohci-sysbus.c @@ -61,6 +61,7 @@ static const Property ohci_sysbus_properties[] = { DEFINE_PROP_UINT32("num-ports", OHCISysBusState, num_ports, 3), DEFINE_PROP_UINT32("firstport", OHCISysBusState, firstport, 0), DEFINE_PROP_UINT64("dma-offset", OHCISysBusState, dma_offset, 0), + DEFINE_PROP_BOOL("auto-hub", OHCISysBusState, ohci.auto_hub, false), }; static void ohci_sysbus_class_init(ObjectClass *klass, const void *data) diff --git a/hw/usb/hcd-ohci.c b/hw/usb/hcd-ohci.c index 5e5fe41f47..2c25829b76 100644 --- a/hw/usb/hcd-ohci.c +++ b/hw/usb/hcd-ohci.c @@ -1987,6 +1987,7 @@ void usb_ohci_init(OHCIState *ohci, DeviceState *dev, uint32_t num_ports, } } else { usb_bus_new(&ohci->bus, sizeof(ohci->bus), &ohci_bus_ops, dev); + ohci->bus.auto_hub = ohci->auto_hub; for (i = 0; i < num_ports; i++) { usb_register_port(&ohci->bus, &ohci->rhport[i].port, ohci, i, &ohci_port_ops, diff --git a/hw/usb/pc87560-ohci.c b/hw/usb/pc87560-ohci.c index cc00f6e936..66c1e62d48 100644 --- a/hw/usb/pc87560-ohci.c +++ b/hw/usb/pc87560-ohci.c @@ -296,6 +296,7 @@ static const Property ohci_pci_properties[] = { DEFINE_PROP_STRING("masterbus", OHCIPCIState, masterbus), DEFINE_PROP_UINT32("num-ports", OHCIPCIState, num_ports, 3), DEFINE_PROP_UINT32("firstport", OHCIPCIState, firstport, 0), + DEFINE_PROP_BOOL("auto-hub", OHCIPCIState, state.auto_hub, false), }; static const VMStateDescription vmstate_ohci = { -- 2.43.0
