Revision 4224558f
b/hw/usb/hcd-ehci.c | ||
---|---|---|
1395 | 1395 |
|
1396 | 1396 |
// 4.10.3 |
1397 | 1397 |
|
1398 |
static int ehci_execute(EHCIQueue *q)
|
|
1398 |
static int ehci_execute(EHCIPacket *p)
|
|
1399 | 1399 |
{ |
1400 |
EHCIPacket *p = QTAILQ_FIRST(&q->packets); |
|
1401 | 1400 |
USBDevice *dev; |
1402 | 1401 |
USBEndpoint *ep; |
1403 | 1402 |
int ret; |
1404 | 1403 |
int endp; |
1405 | 1404 |
int devadr; |
1406 | 1405 |
|
1407 |
assert(p != NULL); |
|
1408 |
assert(p->qtdaddr == q->qtdaddr); |
|
1409 |
|
|
1410 |
if ( !(q->qh.token & QTD_TOKEN_ACTIVE)) { |
|
1411 |
fprintf(stderr, "Attempting to execute inactive QH\n"); |
|
1406 |
if (!(p->qtd.token & QTD_TOKEN_ACTIVE)) { |
|
1407 |
fprintf(stderr, "Attempting to execute inactive qtd\n"); |
|
1412 | 1408 |
return USB_RET_PROCERR; |
1413 | 1409 |
} |
1414 | 1410 |
|
1415 |
p->tbytes = (q->qh.token & QTD_TOKEN_TBYTES_MASK) >> QTD_TOKEN_TBYTES_SH;
|
|
1411 |
p->tbytes = (p->qtd.token & QTD_TOKEN_TBYTES_MASK) >> QTD_TOKEN_TBYTES_SH;
|
|
1416 | 1412 |
if (p->tbytes > BUFF_SIZE) { |
1417 | 1413 |
fprintf(stderr, "Request for more bytes than allowed\n"); |
1418 | 1414 |
return USB_RET_PROCERR; |
1419 | 1415 |
} |
1420 | 1416 |
|
1421 |
p->pid = (q->qh.token & QTD_TOKEN_PID_MASK) >> QTD_TOKEN_PID_SH;
|
|
1417 |
p->pid = (p->qtd.token & QTD_TOKEN_PID_MASK) >> QTD_TOKEN_PID_SH;
|
|
1422 | 1418 |
switch (p->pid) { |
1423 | 1419 |
case 0: |
1424 | 1420 |
p->pid = USB_TOKEN_OUT; |
... | ... | |
1438 | 1434 |
return USB_RET_PROCERR; |
1439 | 1435 |
} |
1440 | 1436 |
|
1441 |
endp = get_field(q->qh.epchar, QH_EPCHAR_EP);
|
|
1442 |
devadr = get_field(q->qh.epchar, QH_EPCHAR_DEVADDR);
|
|
1437 |
endp = get_field(p->queue->qh.epchar, QH_EPCHAR_EP);
|
|
1438 |
devadr = get_field(p->queue->qh.epchar, QH_EPCHAR_DEVADDR);
|
|
1443 | 1439 |
|
1444 | 1440 |
/* TODO: associating device with ehci port */ |
1445 |
dev = ehci_find_device(q->ehci, devadr);
|
|
1441 |
dev = ehci_find_device(p->queue->ehci, devadr);
|
|
1446 | 1442 |
ep = usb_ep_get(dev, p->pid, endp); |
1447 | 1443 |
|
1448 | 1444 |
usb_packet_setup(&p->packet, p->pid, ep); |
... | ... | |
1912 | 1908 |
ehci_set_usbsts(q->ehci, USBSTS_REC); |
1913 | 1909 |
} |
1914 | 1910 |
|
1915 |
p->usb_status = ehci_execute(q);
|
|
1911 |
p->usb_status = ehci_execute(p);
|
|
1916 | 1912 |
if (p->usb_status == USB_RET_PROCERR) { |
1917 | 1913 |
again = -1; |
1918 | 1914 |
goto out; |
Also available in: Unified diff