|
@@ -23,6 +23,7 @@ typedef struct EHCIPCIInfo {
|
|
|
uint16_t vendor_id;
|
|
|
uint16_t device_id;
|
|
|
uint8_t revision;
|
|
|
+ bool companion;
|
|
|
} EHCIPCIInfo;
|
|
|
|
|
|
static int usb_ehci_pci_initfn(PCIDevice *dev)
|
|
@@ -71,6 +72,7 @@ static int usb_ehci_pci_initfn(PCIDevice *dev)
|
|
|
|
|
|
static void usb_ehci_pci_init(Object *obj)
|
|
|
{
|
|
|
+ DeviceClass *dc = OBJECT_GET_CLASS(DeviceClass, obj, TYPE_DEVICE);
|
|
|
EHCIPCIState *i = PCI_EHCI(obj);
|
|
|
EHCIState *s = &i->ehci;
|
|
|
|
|
@@ -81,6 +83,10 @@ static void usb_ehci_pci_init(Object *obj)
|
|
|
s->portscbase = 0x44;
|
|
|
s->portnr = NB_PORTS;
|
|
|
|
|
|
+ if (!dc->hotpluggable) {
|
|
|
+ s->companion_enable = true;
|
|
|
+ }
|
|
|
+
|
|
|
usb_ehci_init(s, DEVICE(obj));
|
|
|
}
|
|
|
|
|
@@ -137,7 +143,6 @@ static void ehci_class_init(ObjectClass *klass, void *data)
|
|
|
k->exit = usb_ehci_pci_exit;
|
|
|
k->class_id = PCI_CLASS_SERIAL_USB;
|
|
|
k->config_write = usb_ehci_pci_write_config;
|
|
|
- dc->hotpluggable = false;
|
|
|
dc->vmsd = &vmstate_ehci_pci;
|
|
|
dc->props = ehci_pci_properties;
|
|
|
}
|
|
@@ -161,6 +166,9 @@ static void ehci_data_class_init(ObjectClass *klass, void *data)
|
|
|
k->device_id = i->device_id;
|
|
|
k->revision = i->revision;
|
|
|
set_bit(DEVICE_CATEGORY_USB, dc->categories);
|
|
|
+ if (i->companion) {
|
|
|
+ dc->hotpluggable = false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static struct EHCIPCIInfo ehci_pci_info[] = {
|
|
@@ -174,11 +182,13 @@ static struct EHCIPCIInfo ehci_pci_info[] = {
|
|
|
.vendor_id = PCI_VENDOR_ID_INTEL,
|
|
|
.device_id = PCI_DEVICE_ID_INTEL_82801I_EHCI1,
|
|
|
.revision = 0x03,
|
|
|
+ .companion = true,
|
|
|
},{
|
|
|
.name = "ich9-usb-ehci2", /* 00:1a.7 */
|
|
|
.vendor_id = PCI_VENDOR_ID_INTEL,
|
|
|
.device_id = PCI_DEVICE_ID_INTEL_82801I_EHCI2,
|
|
|
.revision = 0x03,
|
|
|
+ .companion = true,
|
|
|
}
|
|
|
};
|
|
|
|