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