Revision 7f74a56b hw/usb-hub.c

b/hw/usb-hub.c
455 455
    return ret;
456 456
}
457 457

  
458
static int usb_hub_broadcast_packet(USBHubState *s, USBPacket *p)
459
{
460
    USBHubPort *port;
461
    USBDevice *dev;
462
    int i, ret;
463

  
464
    for(i = 0; i < NUM_PORTS; i++) {
465
        port = &s->ports[i];
466
        dev = port->port.dev;
467
        if (dev && dev->attached && (port->wPortStatus & PORT_STAT_ENABLE)) {
468
            ret = usb_handle_packet(dev, p);
469
            if (ret != USB_RET_NODEV) {
470
                return ret;
471
            }
472
        }
473
    }
474
    return USB_RET_NODEV;
475
}
476

  
477
static int usb_hub_handle_packet(USBDevice *dev, USBPacket *p)
478
{
479
    USBHubState *s = (USBHubState *)dev;
480

  
481
#if defined(DEBUG) && 0
482
    printf("usb_hub: pid=0x%x\n", pid);
483
#endif
484
    if (dev->state == USB_STATE_DEFAULT &&
485
        dev->addr != 0 &&
486
        p->devaddr != dev->addr &&
487
        (p->pid == USB_TOKEN_SETUP ||
488
         p->pid == USB_TOKEN_OUT ||
489
         p->pid == USB_TOKEN_IN)) {
490
        /* broadcast the packet to the devices */
491
        return usb_hub_broadcast_packet(s, p);
492
    }
493
    return usb_generic_handle_packet(dev, p);
494
}
495

  
496 458
static void usb_hub_handle_destroy(USBDevice *dev)
497 459
{
498 460
    USBHubState *s = (USBHubState *)dev;
......
562 524
    uc->product_desc   = "QEMU USB Hub";
563 525
    uc->usb_desc       = &desc_hub;
564 526
    uc->find_device    = usb_hub_find_device;
565
    uc->handle_packet  = usb_hub_handle_packet;
566 527
    uc->handle_reset   = usb_hub_handle_reset;
567 528
    uc->handle_control = usb_hub_handle_control;
568 529
    uc->handle_data    = usb_hub_handle_data;

Also available in: Unified diff