Hi,

+    if (s->masterbus) {
+        USBPort *ports[NB_PORTS];
+        for(i = 0; i<  NB_PORTS; i++) {
+            s->ports[i].port.ops =&uhci_port_ops;
+            s->ports[i].port.opaque = s;
+            s->ports[i].port.index = i;
+            s->ports[i].port.speedmask =
+                USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL;
+            usb_port_location(&s->ports[i].port, NULL, i+1);
+            ports[i] =&s->ports[i].port;
+        }
+        if (usb_bus_register_companion(s->masterbus, ports, NB_PORTS,
+                                       s->firstport) != 0) {
+            return -1;
+        }
+    } else {
+        usb_bus_new(&s->bus,&uhci_bus_ops,&s->dev.qdev);
+        for(i = 0; i<  NB_PORTS; i++) {
+            usb_register_port(&s->bus,&s->ports[i].port, s, i,&uhci_port_ops,
+                              USB_SPEED_MASK_LOW | USB_SPEED_MASK_FULL);
+            usb_port_location(&s->ports[i].port, NULL, i+1);
+        }

This looks like we'll want a usb_register_companion_port() function which looks like usb_register_port() but accepts masterbus & portindex instead of a USBBus pointer. Then register the companion ports one by one, so that the code path for the companion case looks almost identical to the non-companion case.

Otherwise the whole patchset looks very good.

cheers,
  Gerd

Reply via email to