mirror of https://github.com/xemu-project/xemu.git
usb-ehci: switch to usb_find_device()
Switch over EHCI to use the new usb_find_device() function for device lookup. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
461700c1dc
commit
828143c621
|
@ -850,6 +850,26 @@ static int ehci_register_companion(USBBus *bus, USBPort *ports[],
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static USBDevice *ehci_find_device(EHCIState *ehci, uint8_t addr)
|
||||||
|
{
|
||||||
|
USBDevice *dev;
|
||||||
|
USBPort *port;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < NB_PORTS; i++) {
|
||||||
|
port = &ehci->ports[i];
|
||||||
|
if (!(ehci->portsc[i] & PORTSC_PED)) {
|
||||||
|
DPRINTF("Port %d not enabled\n", i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
dev = usb_find_device(port, addr);
|
||||||
|
if (dev != NULL) {
|
||||||
|
return dev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* 4.1 host controller initialization */
|
/* 4.1 host controller initialization */
|
||||||
static void ehci_reset(void *opaque)
|
static void ehci_reset(void *opaque)
|
||||||
{
|
{
|
||||||
|
@ -1336,10 +1356,8 @@ err:
|
||||||
|
|
||||||
static int ehci_execute(EHCIQueue *q)
|
static int ehci_execute(EHCIQueue *q)
|
||||||
{
|
{
|
||||||
USBPort *port;
|
|
||||||
USBDevice *dev;
|
USBDevice *dev;
|
||||||
int ret;
|
int ret;
|
||||||
int i;
|
|
||||||
int endp;
|
int endp;
|
||||||
int devadr;
|
int devadr;
|
||||||
|
|
||||||
|
@ -1375,27 +1393,12 @@ static int ehci_execute(EHCIQueue *q)
|
||||||
usb_packet_map(&q->packet, &q->sgl);
|
usb_packet_map(&q->packet, &q->sgl);
|
||||||
|
|
||||||
// TO-DO: associating device with ehci port
|
// TO-DO: associating device with ehci port
|
||||||
for(i = 0; i < NB_PORTS; i++) {
|
dev = ehci_find_device(q->ehci, q->packet.devaddr);
|
||||||
port = &q->ehci->ports[i];
|
ret = usb_handle_packet(dev, &q->packet);
|
||||||
dev = port->dev;
|
DPRINTF("submit: qh %x next %x qtd %x pid %x len %zd "
|
||||||
|
"(total %d) endp %x ret %d\n",
|
||||||
if (!(q->ehci->portsc[i] &(PORTSC_CONNECT))) {
|
q->qhaddr, q->qh.next, q->qtdaddr, q->pid,
|
||||||
DPRINTF("Port %d, no exec, not connected(%08X)\n",
|
q->packet.iov.size, q->tbytes, endp, ret);
|
||||||
i, q->ehci->portsc[i]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = usb_handle_packet(dev, &q->packet);
|
|
||||||
|
|
||||||
DPRINTF("submit: qh %x next %x qtd %x pid %x len %zd "
|
|
||||||
"(total %d) endp %x ret %d\n",
|
|
||||||
q->qhaddr, q->qh.next, q->qtdaddr, q->pid,
|
|
||||||
q->packet.iov.size, q->tbytes, endp, ret);
|
|
||||||
|
|
||||||
if (ret != USB_RET_NODEV) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret > BUFF_SIZE) {
|
if (ret > BUFF_SIZE) {
|
||||||
fprintf(stderr, "ret from usb_handle_packet > BUFF_SIZE\n");
|
fprintf(stderr, "ret from usb_handle_packet > BUFF_SIZE\n");
|
||||||
|
@ -1411,10 +1414,9 @@ static int ehci_execute(EHCIQueue *q)
|
||||||
static int ehci_process_itd(EHCIState *ehci,
|
static int ehci_process_itd(EHCIState *ehci,
|
||||||
EHCIitd *itd)
|
EHCIitd *itd)
|
||||||
{
|
{
|
||||||
USBPort *port;
|
|
||||||
USBDevice *dev;
|
USBDevice *dev;
|
||||||
int ret;
|
int ret;
|
||||||
uint32_t i, j, len, pid, dir, devaddr, endp;
|
uint32_t i, len, pid, dir, devaddr, endp;
|
||||||
uint32_t pg, off, ptr1, ptr2, max, mult;
|
uint32_t pg, off, ptr1, ptr2, max, mult;
|
||||||
|
|
||||||
dir =(itd->bufptr[1] & ITD_BUFPTR_DIRECTION);
|
dir =(itd->bufptr[1] & ITD_BUFPTR_DIRECTION);
|
||||||
|
@ -1455,21 +1457,8 @@ static int ehci_process_itd(EHCIState *ehci,
|
||||||
usb_packet_setup(&ehci->ipacket, pid, devaddr, endp);
|
usb_packet_setup(&ehci->ipacket, pid, devaddr, endp);
|
||||||
usb_packet_map(&ehci->ipacket, &ehci->isgl);
|
usb_packet_map(&ehci->ipacket, &ehci->isgl);
|
||||||
|
|
||||||
ret = USB_RET_NODEV;
|
dev = ehci_find_device(ehci, ehci->ipacket.devaddr);
|
||||||
for (j = 0; j < NB_PORTS; j++) {
|
ret = usb_handle_packet(dev, &ehci->ipacket);
|
||||||
port = &ehci->ports[j];
|
|
||||||
dev = port->dev;
|
|
||||||
|
|
||||||
if (!(ehci->portsc[j] &(PORTSC_CONNECT))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = usb_handle_packet(dev, &ehci->ipacket);
|
|
||||||
|
|
||||||
if (ret != USB_RET_NODEV) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
usb_packet_unmap(&ehci->ipacket);
|
usb_packet_unmap(&ehci->ipacket);
|
||||||
qemu_sglist_destroy(&ehci->isgl);
|
qemu_sglist_destroy(&ehci->isgl);
|
||||||
|
|
Loading…
Reference in New Issue