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